第9回 初めてのOpenCV開発 ― opencv_contrib紹介【OpenCV 3.1.0】OpenCV入門【3.0対応】

拡張モジュール群であるopencv_contribについて紹介する。

» 2017年09月12日 05時00分 公開
「OpenCV入門【3.0対応】」のインデックス

連載目次

ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「www.buildinsider.net」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

1. はじめに

 これまではOpenCVのメインモジュールについて紹介してきました。今回は、OpenCVの拡張モジュール群であるopencv_contribについて紹介します。

2. opencv_contribとは

 opencv_contribとは、contributorによって寄贈された拡張モジュール群です。また、opencv_contribリポジトリでは、opencv_contribについて、

This repository is intended for development of so-called "extra" modules, contributed functionality. New modules quite often do not have stable API, and they are not well-tested.

と紹介しており、opencv_contribでは比較的最新のアルゴリズム、試験的な機能が実装されることが多いため、それらのアルゴリズム、機能を試すのに適しています。ただし、テストが十分に行われていなかったり、APIが変更される可能性があったりするため、使用する際にはその旨に注意する必要があります。

 このopencv_contribは下記リンク先のリポジトリで管理されており、OpenCVのメインリポジトリとは別になっている点に注意が必要です。

 加えて、opencv_contribリポジトリに、

So, all the new modules should be developed separately, and published in the opencv_contrib repository at first. Later, when the module matures and gains popularity, it is moved to the central OpenCV repository, and the development team provides production quality support for this module.

と書かれてあるように、opencv_contribで成熟してポピュラーになったモジュールはOpenCVのメインリポジトリに移行されることがあります。最近の事例だと、OpenCV 3.3でdnnモジュールがメインリポジトリに移行されています。

 このopencv_contribのビルド方法について気になる方は公式ページを参照してください。

2.1 opencv_contribのモジュール一覧

 以下の表に執筆時点で最新のOpenCV 3.3に対応するopencv_contribのモジュール一覧を示します。

モジュール名 機能 URL
aruco AR(Augmented Reality)マーカー検出機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/aruco
bgsegm 背景、前景セグメンテーションアルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/bgsegm
bioinspired Biologically inspired vision model https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/bioinspired
ccalib カメラキャリブレーション機能(魚眼カメラ、マルチカメラ) https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/ccalib
cnn_3dobj 3Dオブジェクトの分類および姿勢推定 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/cnn_3dobj
cvv デバッグ用可視化ツール https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/cvv
datasets 既存の学習データセットの読み込み機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/datasets
dpm Deformable Part Modelを用いた物体検出 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/dpm
face 顔認識(Eigenfaces、Fisherfaces、Local Binary Patterns Histograms) https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/face
freetype freetype/harfbuzzによる文字描画機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/freetype
fuzzy ファジィ理論を用いた画像処理アルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/fuzzy
hdf HDFフォーマットのファイル読み込み機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/hdf
image_hash image hashingアルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/image_hash
line_descriptor 線分抽出のためのBinary descriptor https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/line_descriptor
matlab MATLABブリッジ機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/matlab
optflow オプティカルフローアルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/optflow
phase_unwrapping 2次元の位相マップのアンラッピング https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/phase_unwrapping
plot プロット機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/plot
reg 画像の自動位置合わせアルゴリズム(Image Registration) https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/reg
rgbd RGB-D処理 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/rgbd
saliency 顕著性マップ推定 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/saliency
sfm Structure From Motionアルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/sfm
stereo ステレオマッチングアルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/stereo
structured_light デプス推定のためのグレイコードパターン生成 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/structured_light
surface_matching Surface Matchingアルゴリズム https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/surface_matching
text テキスト領域の検出および認識機能 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/text
tracking オブジェクトトラッキング https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/tracking
xfeatures2d features2dモジュールのアルゴリズム拡張 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/xfeatures2d
ximgproc imgprocモジュールのアルゴリズム拡張 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/ximgproc
xobjdetect objdetectモジュールのアルゴリズム拡張 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/xobjdetect
xphoto photoモジュールのアルゴリズム拡張 https://github.com/opencv/opencv_contrib/tree/3.3.0/modules/xphoto
表1 OpenCV 3.3に対応するopencv_contribのモジュール一覧

2.2 opencv_contribのチュートリアル

 下記リンク先のページが、opencv_contribの各モジュールに関するチュートリアル(英語)です。気になる方は読んでみるとよいでしょう。

3. opencv_contribのデモ紹介

 ここではopencv_contribのモジュールについてイメージを掴んでいただくためにデモを紹介します。

3.1 arucoモジュール

 arucoモジュールはAR(Augmented Reality)の「マーカー生成」「マーカー検出」機能を提供しています。

3.1.1 ARマーカー生成

 arucoモジュールでは、ARマーカーを生成できます。図1にarucoモジュールで生成したマーカーの例を示します。

図1 arucoモジュールによるマーカー生成 図1 arucoモジュールで生成したマーカー画像

3.1.2 ARマーカー検出

 以下の動画は、arucoモジュールでARマーカーを検出して、ARマーカーのIDを認識し、そのマーカーの姿勢を推定しているデモムービーです。

[GSoC 15] Detection of ArUco board using OpenCV aruco module - YouTube


3.2 bgsegmモジュール

3.2.1 前景セグメンテーション

 背景・前景のセグメンテーションを行う機能はvideoモジュールでも提供されていますが、bgsegmモジュールは、それらの拡張アルゴリズムを提供しています。図2は、定点カメラで撮影された動画像に対して前景セグメンテーションを行った例です。水色の領域が前景と見なされた領域で、歩行者が前景と見なされていることが分かります。

図2 前景セグメンテーション

図2 前景セグメンテーション


3.3 stereoモジュール

 ステレオマッチング(=左右に示した画像に対する視差によって奥行きを生み出す手法)の機能はcalib3dモジュールでも提供されていますが、stereoモジュールでは以下の拡張アルゴリズムを提供しています。

 これらの関数は、calib3dモジュールとは異なり、バイナリ特徴量を用いて、disparity map(視差マップ)を算出できます。以下に今回用いたステレオマッチングの入力となるleft image(左の画像)とright image(右の画像)を示します。

left image | right image left image | right image

 図3はStereoBinarySGBMを使って生成したdisparity mapです。

図3 StereoBinarySGBMで得られたdisparity map

図3 StereoBinarySGBMで得られたdisparity map


3.4 ximgprocモジュール

3.4.1 disparity mapのフィルタリング

 ximgprocモジュールは、disparity map(視差マップ)のフィルタリング機能(cv::ximgproc::DisparityWLSFilter)を提供しています。

 図4はStereoSGBMを使って生成したdisparity map(フィルタリング前)です。この図で黒い部分が誤マッチングにより視差が計算できなかった領域となります。

図4 disparity map(フィルタリング前) 図4 disparity map(フィルタリング前)

 図5はximgprocモジュールのcv::ximgproc::DisparityWLSFilterを用いてフィルタリングを行った後のdisparity mapです。このフィルタリング処理によって、図4では視差が計算できていなかった領域の視差が補間できていることが分かります。

図5 disparity map(フィルタリング後) 図5 disparity map(フィルタリング後)

3.4.2 細線化

 ximgprocモジュールは、細線化(=2値画像を線幅1ピクセルとなるスケルトン画像に変換する処理)の機能(cv::ximgproc::thinning)を提供しています。

 図6は細線化の入力画像です。

図6 入力画像 図6 入力画像

 図7は細線化の出力画像です。この結果からも分かるように線幅1ピクセルとなるスケルトン画像が得られていることが分かります。

図7 出力画像 図7 出力画像

4. おわりに

 今回は、OpenCVの拡張モジュール群であるopencv_contribについて概要を紹介しました。

「OpenCV入門【3.0対応】」のインデックス

OpenCV入門【3.0対応】

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。