OpenCV のサンプルプログラム(ビデオ関係)
【サイト内の OpenCV 関連ページ】
- OpenCV について [PDF] , [パワーポイント]
- OpenCV のインストール,画像表示を行う C++ プログラムの実行手順: 別ページ »で説明
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »にまとめ
- OpenCV 4 の C/C++ プログラム: 別ページ »にまとめている.
【OpenCV の公式情報】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
前景・背景分離
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