OpenCV のサンプルプログラム(ビデオ関係)

【サイト内の OpenCV 関連ページ】

【OpenCV の公式情報】

前景・背景分離

cvCreateGaussianBGModel を用いた前景と背景の分離

ガウス混合モデル(GMM)を用いて、動画から前景と背景を分離する。動く物体を前景として抽出できる。 *ビデオカメラにも使えそうです

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/bgfg_segm.cpp .
g++ -o a.out bgfg_segm.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out /usr/local/share/opencv/samples/c/tree.avi

bgfg_codebook.cpp

Codebook法による背景・前景分離を行う。各画素について背景モデルをCodebookとして学習し、前景を抽出する。照明変動に対してある程度頑健な手法である。

cd /tmp
cp /usr/local/share/opencv/samples/c/bgfg_codebook.cpp .
g++ -o a.out bgfg_codebook.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out

bgfg_segm.cpp

ガウス混合モデル(GMM)を用いた背景・前景分離を行う。背景を複数のガウス分布の混合としてモデル化し、動く物体を前景として検出する。

cd /tmp
cp /usr/local/share/opencv/samples/c/bgfg_segm.cpp .
g++ -o a.out bgfg_segm.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out /usr/local/share/opencv/samples/c/fruits.jpg

オプティカルフロー

calcOpticalFlowFarneback を用いたオプティカルフロー

Farneback法による密なオプティカルフローを計算する。画像内の全画素について動きベクトルを推定し、物体の動きを可視化できる。ビデオキャプチャしながらオプティカルフローを表示する。

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/fback.cpp .
g++ -o a.out fback.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out

fback_c.c

Farneback法による密なオプティカルフローのC言語実装版。ビデオデバイスからの入力に対応。

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/fback_c.c .
g++ -o a.out fback_c.c -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out

動き検出

motempl.c

モーションテンプレートを用いた動き検出と方向推定を行う。フレーム間差分の履歴を蓄積し、動きの軌跡と方向を可視化する。ジェスチャ認識などに応用可能。ビデオデバイスを入力として使用。

cd /tmp
cp /usr/local/share/opencv/samples/c/motempl.c .
g++ -o a.out motempl.c -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out

画像フィルタ・変換

laplace.c

Laplacian演算子を用いたエッジ検出を行う。画像の2次微分を計算し、輝度変化の激しい箇所(エッジ)を検出する。ビデオデバイスまたは画像ファイルを入力として使用可能。

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/laplace.c .
g++ -o a.out laplace.c -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out /usr/local/share/opencv/samples/c/fruits.jpg

polar_transforms.c

線形極座標変換(linearPolar)と対数極座標変換(logPolar)のデモ。直交座標系の画像を極座標系に変換する。回転不変な画像処理や、中心からの距離に応じた解像度変化が必要な場合に使用される。

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/polar_transforms.c .
g++ -o a.out polar_transforms.c -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out /usr/local/share/opencv/samples/c/fruits.jpg

画像セグメンテーション

pyramid_segmentation.c

ピラミッドセグメンテーション(cvPyrSegmentation)を用いた色領域分割を行う。画像を色の類似性に基づいて複数の領域に分割する。

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/pyramid_segmentation.c .
g++ -o a.out pyramid_segmentation.c -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_core
./a.out /usr/local/share/opencv/samples/c/fruits.jpg

肌色検出

adaptiveskindetector.cpp

適応的肌色検出アルゴリズムのデモ。HSV色空間における色相(Hue)を基に、照明条件の変化に適応しながら肌色領域を検出する。ビデオデバイスを入力として使用。

cd /tmp
cp /usr/local/share/opencv/samples/c/adaptiveskindetector.cpp .
g++ -o a.out adaptiveskindetector.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_contrib -lopencv_core
./a.out

特徴点マッチング・物体検出

find_obj_calonder.cpp

Calonder記述子を用いた特徴点マッチングを行う。SURFで検出した特徴点に対してCalonder記述子を計算し、画像間の対応点を求める。

cd /tmp
cp /usr/local/share/opencv/samples/c/find_obj_calonder.cpp .
g++ -o a.out find_obj_calonder.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_features2d -lopencv_flann -lopencv_calib3d -lopencv_core
./a.out

find_obj_ferns.cpp

Ferns記述子(ランダムFerns)を用いた平面物体検出を行う。学習画像に対してFerns分類器を訓練し、シーン画像中から対象物体を検出する。

cd /tmp
cp /usr/local/share/opencv/samples/c/find_obj_ferns.cpp .
cp /usr/local/share/opencv/samples/c/box* .
g++ -o a.out find_obj_ferns.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_features2d -lopencv_flann -lopencv_calib3d -lopencv_objdetect -lopencv_core
./a.out

latentsvmdetect.cpp

Latent SVM(Deformable Part Models)を用いた物体検出を行う。物体を複数のパーツとその幾何学的配置としてモデル化し、人物・車・動物などの検出が可能。事前学習済みモデルを使用する。

cd /tmp
cp /usr/local/share/opencv/samples/c/latentsvmdetect.cpp .
cp /usr/local/share/opencv/samples/c/cat* .
g++ -o a.out latentsvmdetect.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_objdetect -lopencv_core
./a.out

one_way_sample.cpp

One-Way記述子を用いた特徴点対応付けを行う。特徴点のアフィン変換に対して頑健な記述子を計算し、2枚の画像間で対応点を求める。

cd /tmp
cp /usr/local/share/opencv/samples/c/one_way_sample.cpp .
cp /tmp/scene* /tmp
g++ -o a.out one_way_sample.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_features2d -lopencv_core
 ./a.out . scene_l.bmp scene_r.bmp

機械学習

mushroom.cpp

決定木(Decision Tree)を用いた分類のサンプル。UCI Machine Learning Repositoryのキノコデータセットを使用し、キノコが食用か毒性かを分類する機械学習の例題。

cd /tmp
cp /usr/local/share/opencv/samples/c/mushroom.cpp .
g++ -o a.out mushroom.cpp -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_ml -lopencv_core
./a.out

ユーティリティ

convert_cascade.c

Haarカスケード分類器のXMLファイル形式を変換するユーティリティ。旧形式のカスケードファイルを新形式に変換する際に使用する。

cd /tmp
cp /usr/share/doc/opencv-doc/examples/c/convert_cascade.c .
g++ -o a.out convert_cascade.c -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_objdetect -lopencv_core
./a.out 640 480 hoge.png