概要
OpenCVのtrackingを使用して物体の追跡を行う
環境
- Windows 10(64Bit)
- OpenCV3.1
- CMake 3.6.1(64Bit)
- Visual Studio 2015
対象
- Visual StudioでC(++)の実行環境を構築出来る
- PATHの設定が出来る
記事を読んで出来る事
- OpenCVのVisual Studio向けビルド環境構築
- 動画の1フレーム目を利用して追跡対象の物体を選択し、その後追跡中にモザイクをかけるプログラムの実行
発展させるとしたら
- AviUtlのプラグイン作成
- スマホからの動画編集アプリ
注意
- 公開するプログラムは最小単位なのでエラー等は考慮しないものとする
- ファイルを取得し展開する必要のあるものは全て『c:\』へ展開したものとして記載する
- パスを通す手順は記載を省くので各自対応しているものとする
手順
OpenCVの取得
https://github.com/opencv/opencv/releases からOpenCV 3.1を取得し任意の場所に展開する
contribの取得
https://github.com/opencv/opencv_contrib より、cloneするか、zipでファイルを取得し任意の場所に展開する
contribビルド
Visual Studio 2015向けビルド環境構築
Visual Studioのソリューションファイル生成
CMakeを起動し以下の設定を行う
設定内容 | 値 |
---|---|
Where is the source code | C:/opencv/sources |
Where to build the binaries | C:/opencv/build |
入力後、「Configure」する
設定内容 | 値 |
---|---|
Specify the generator for this project | Visual Studio 14 2015 |
Radio Button | Use default native compilers |
更に以下のオプション設定を行う
Name | Value |
---|---|
OPENCV_EXTRA_MODULES_PATH | c:/opencv_contrib-master/modules |
入力後再度、「Configure」する
エラーが出ていなければ続いて「Generate」する
Visual Studioからcontribビルド
C:\opencv\build\OpenCV.slnを実行し、Debug・Release共にビルドする
実装
Visual Studioのソリューションを作成する
アプリケーション設定
設定 | 値 |
---|---|
アプリケーションの種類 | Windows アプリケーション |
追加オプション | 空のプロジェクト |
コンソールでも問題ないと思うが拡張する上でファイルの読み込みやUI設計する可能性があるのでこうした
main.cpp
#include <opencv2\opencv.hpp>
#include <opencv2\video.hpp>
#include <opencv2\tracking.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include <Windows.h>
#pragma comment(lib, "opencv_core310.lib")
#pragma comment(lib, "opencv_videoio310.lib")
#pragma comment(lib, "opencv_tracking310.lib")
#pragma comment(lib, "opencv_highgui310.lib")
#pragma comment(lib, "opencv_imgproc310.lib")
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
cv::VideoCapture cap(『任意の動画ファイルを指定』);
if (!cap.isOpened()) return 0;
cv::Mat frame;
cap >> frame;
cv::Rect2d roi = cv::selectROI("Target", frame);
cv::Ptr<cv::Tracker> tracker = cv::Tracker::create("MIL");
tracker->init(frame, roi);
for (;;)
{
// 切り出してモザイクかけてもどす.
// 倍率は20
cv::Mat mosaic(frame, roi);
cv::resize(mosaic, mosaic, cv::Size(), 0.05, 0.05);
cv::resize(mosaic, mosaic, cv::Size(), 20, 20, cv::INTER_NEAREST);
cv::Mat mat = (cv::Mat_<double>(2, 3) << 1.0, 0.0, roi.x, 0.0, 1.0, roi.y);
cv::warpAffine(mosaic, frame, mat, frame.size(), CV_INTER_LINEAR, cv::BORDER_TRANSPARENT);
cv::imshow("Tracking", frame);
if (cv::waitKey(1) == 0x1B) break;
cap >> frame;
if (frame.empty()) break;
tracker->update(frame, roi);
}
cv::destroyAllWindows();
return 0;
}
実施している事
- 動画の読み込み
- 1フレーム目から追跡対象特定(マウスで枠を作成し、Enterキーで確定)
- 1フレームづつ追跡対象にモザイクをかけ画像を合成し表示
- 最終フレームまたはEscキー入力で終了