OpenCV3.1のTracking APIでトラッキングを試す

公開日: : OpenCV, 画像処理

スポンサーリンク

はじめに

先日OpenCV3.1をopencv_contrib付きでインストールしてTracking APIを試したので簡単に結果だけ記しておきます。

トラッキングオブジェクト

トラッキングオブジェクトは「opencv2/tracking.hpp」の「cv::Tracker」のスタティックで定義されているcreateメソッドで生成します。

cv::Ptr<cv::Tracker> tracker = cv::Tracker::create("KCF");

トラッキング手法をcreateメソッドの引数から文字列で指定することができます。指定できるのは「MIL」,「BOOSTING」,「MEDIANFLOW」,「TLD」,「KCF」の5つのようです。今回はサンプルで指定されている「KCF」を使ってみました。

追跡結果サンプル

指定の動画を読み込んで1フレーム目で追跡対象物体を矩形を選択したらトラッキングを開始するようなものを作りました。トラッキングの結果は別途動画で保存させいます。下記がその一例です。

1フレーム目でてんとうむしに青い矩形を手動で指定して追跡させました。この動画自体は元の動画に青い矩形を追加して表示しています。

今回は対象の動画が単純ということもありますが、物体(てんとうむし)の移動や回転だけでなく、カメラの手ぶれにも対応できているようです。

ソースコード

#include <opencv2/core/utility.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstring>

#ifdef _DEBUG
#pragma comment(lib, "opencv_core310d.lib")
#pragma comment(lib, "opencv_videoio310d.lib")
#pragma comment(lib, "opencv_highgui310d.lib")
#pragma comment(lib, "opencv_tracking310d.lib")
#pragma comment(lib, "opencv_imgproc310d.lib")
#else
#pragma comment(lib, "opencv_core310.lib")
#pragma comment(lib, "opencv_videoio310.lib")
#pragma comment(lib, "opencv_highgui310.lib")
#pragma comment(lib, "opencv_tracking310.lib")
#pragma comment(lib, "opencv_imgproc310.lib")
#endif

//動画ファイル
#define VIDEO_NAME "sample.avi"
#define OUTPUT_VIDEO_NAME "output.avi"


int main(int argc, char** argv){
	//変数定義
	cv::Rect2d roi;
	cv::Mat frame;

	//トラッキングオブジェクト生成
	cv::Ptr<cv::Tracker> tracker = cv::Tracker::create("KCF");

	//動画読み込み
	cv::VideoCapture cap(VIDEO_NAME);
	cap >> frame;

	//初期物体の矩形指定
	roi = selectROI("tracker", frame);
	if (roi.width == 0 || roi.height == 0){
		return 0;
	}

	//トラッカーの初期化
	tracker->init(frame, roi);

	//動画の保存
	std::string filename = OUTPUT_VIDEO_NAME;
	int fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D');
	double fps = 30.0;
	cv::VideoWriter writer(filename, fourcc, fps, frame.size());

	//トラッキング開始
	printf("Start the tracking process, press ESC to quit.\n");
	for (;;){
		//動画からフレームの切り出し
		cap >> frame;

		//フレームが切り出せなくなったら終了
		if (frame.rows == 0 || frame.cols == 0){
			break;
		}

		//更新
		tracker->update(frame, roi);

		//矩形の描画
		rectangle(frame, roi, cv::Scalar(255, 0, 0), 2, 1);

		//動画保存
		writer << frame;

		//結果のGUI表示
		imshow("tracker", frame);

		//ESCを押したら終了
		if (cv::waitKey(1) == 27){
			break;
		}
	}
	return 0;
}
スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

【ImgToAA】画像をAA化するツール

指定の画像を読み込ませてAA化するツールです。サンプルはこちら。 (使い方) 画像ファイ

記事を読む

Canvasの画像をリサイズする簡単な方法【HTML5・javascript】

調べてみるとCanvasをリサイズするようなjavascriptの関数は存在しないようなので自前で作

記事を読む

【Three.js/jThree.js】カメラ内部パラメータを変更して視野などを変える

jThree.jsでカメラの内部パラメータを変更するのに手間取ったのでメモ。参考にしているjThre

記事を読む

【3DCG・MMD】カメラレンズによる見え方シミュレータ作成について

カメラのレンズが違うことでどのくらい出来上がる写真に差が出てくるのかを確かめることのできるシミュレー

記事を読む

OpenCVで矢印を描画する

OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先

記事を読む

javascriptで画像処理をする【HTML5】

HTML5でjavascriptを使って画像処理をしてみました。このページでは手始めにグレースケール

記事を読む

OpenCV3.1をopencv_contrib付きでVisual Studio2013でビルドしてインストールする

はじめに OpenCV3.1でトラッキングがしたいと思いインストーラでインストールしたのですが、ど

記事を読む

【DeepLearning】物体検出手法のSSD(Keras版)を試す (Ubuntu14.04)

はやりのディープラーニングの物体検出手法の一つであるSSDのサンプルを動かしてみたのでそれまでのメモ

記事を読む

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業が立ち上げたVPNサービスとい

記事を読む

【OpenCV】画素値が取得できない??

IplImageに格納された画素値を利用してフィルター処理を行おうとしましたが、なぜか画素値が取得さ

記事を読む

【Unity】他のスクリプトを一括で取得して有効化・無効化を制御する

Unityを使っていて他のスクリプトを一時的に停止させたいと思ったので

テレビの録画をPCやNASで共有する

今までテレビはテレビ用のモニターで見ればいいやと思っていたのですが、さ

【DeepLearning】物体検出手法のSSD(Keras版)を試す (Ubuntu14.04)

はやりのディープラーニングの物体検出手法の一つであるSSDのサンプルを

【Laravel5】既存のDBからデータを取得して表示する

はじめに 今まで作ったWebサイトをLaravel5で見れるようにし

【C++/OpenCV】cv::Matの画像にインパルスノイズを付加する

OpenCVで画像にノイズを付け足したいと思って調べたところ、Pyth

Intel Corei7-7700TでHTC Viveの動作確認

はじめに HTC ViveというVRヘッドセットで遊んでみたのでその

【Python】フォルダ内のカッコ付き数字ファイルを一括でリネームするスクリプト

はじめに タイトルどおりなのですが、指定フォルダ内のファイルのファイ

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑