私は今opencv3.1を用いてトラッキングに挑戦しています。
最初に領域を指定してその領域を追跡することに成功しました。
そこで次に、指定した領域が右に行き過ぎると追跡を終えて、別の領域を追跡するようにしています。
しかしうまく領域の初期化ができません。
コードの間違いやアドバイスなどがありましたら、教えていただきたいです。
よろしくお願いします。
環境
windows7
visual studio2013
opencv3.1
/*
trackerの練習
opencv3.1
visual studio 2013
*/
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#pragma comment(lib, "opencv_core310.lib")
#pragma comment(lib, "opencv_imgcodecs310.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")
using namespace cv;
using namespace std;
int main(void){
//①Trackerの生成
Ptr<Tracker> trackerKCF = Tracker::create("KCF");
//動画の読み込み
VideoCapture cap("001.wmv");
if (!cap.isOpened()) {
std::cout << "ビデオが開けません。" << std::endl;
return -1;
}
Mat frame;
cap >> frame;
//②ROIの設定 (region of interest)
int tracker_x = 0; //xの始点
int tracker_y = 0; //y
int tracker_width = 150; //幅
int tracker_height = 150; //高さ
Rect2d tracker_rect(tracker_x, tracker_y, tracker_width, tracker_height); // x(左上),y(左上),w,h
//③追跡対象を選択
Rect2d tracking_object = tracker_rect;
//⑤trackerの初期化 (ここで追跡するROIを入れる)
trackerKCF->init(frame, tracking_object);
//⑥trackerの色指定
cv::Scalar colorkcf = cv::Scalar(0, 255, 0);
//動画保存の設定
double fps = cap.get(CV_CAP_PROP_FPS);
cv::Size size = cv::Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
const int fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D');
std::string filename = "output.avi";
cv::VideoWriter writer(filename, fourcc, fps, size);
while (1){
cap >> frame;
//動画の最後になったらループ抜ける
if (frame.empty())
break;
int Min_x = 0, Min_y = 0;
int Max_x = 0, Max_y = 0;
double width = 0;
double height = 0;
if (150 < tracking_object.x){
tracker_x = 0;
tracker_y = 0;
tracker_width = 100;
tracker_height = 100;
trackerKCF->init(frame, tracking_object);
}
//⑦trackerの更新
trackerKCF->update(frame, tracking_object);
cv::rectangle(frame, tracking_object, colorkcf, 1, 1);
cv::putText(frame, "- KCF", cv::Point(5, 20), cv::FONT_HERSHEY_SIMPLEX, .5, colorkcf, 1, CV_AA);
//確認用
cout << " x " << tracking_object.x << " y " << tracking_object.y << " width " << tracking_object.width << " height " << tracking_object.height << endl;
//cout << " x " << tracker_x << " y " << tracker_y << " width " << tracker_width << " height " << tracker_height << endl;
//処理終了-----------------------------------------------------------------------------------------
writer << frame;
imshow("a", frame);
int key = cv::waitKey(30);
if (key == 0x1b) //ESCキー
break;
}
cap.release();
writer.release();
cvDestroyAllWindows();
return 0;
}