opencv3.1によるtracking

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
syokkupan
記事: 4
登録日時: 1年前

opencv3.1によるtracking

#1

投稿記事 by syokkupan » 1年前

こんにちは。syokkupanと申します。

私は今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;
}



ポニョ

Re: opencv3.1によるtracking

#2

投稿記事 by ポニョ » 1年前

http://qiita.com/hmichu/items/3615ddcc93851ad59abeなどを見ても良く分からないですね...。
<opencv2/tracking.hpp>をどのように入手されましたでしょうか。

アバター
usao
記事: 1369
登録日時: 5年前

Re: opencv3.1によるtracking

#3

投稿記事 by usao » 1年前

80行目でinit()に渡しているtracking_objectの内容は,前回のトラッキング結果位置のままになっているのではないでしょうか.
(本当は,76~79行目の値を用いたinit()をしたいのでは?)

syokkupan
記事: 4
登録日時: 1年前

Re: opencv3.1によるtracking

#4

投稿記事 by syokkupan » 1年前

返信ありがとうございます。

ポニョさん
<opencv2/tracking.hpp>は、opencv.orgからダウンロードしました。

usaoさん
おっしゃる通り、76~79行目の値を用いたinit()を行おうとしております。

Math

Re: opencv3.1によるtracking

#5

投稿記事 by Math » 1年前

[雑談]OpenCV3.2.0をGet。調査中。
OpenCvSharp3 3.2.0はインストール完了。

コード: 全て選択

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.Blob;
using OpenCvSharp.Detail;
using OpenCvSharp.Extensions;
using OpenCvSharp.Face;
using OpenCvSharp.Flann;
using OpenCvSharp.Gpu;
using OpenCvSharp.ML;
using OpenCvSharp.UserInterface;
using OpenCvSharp.Util;
using OpenCvSharp.XFeatures2D;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Math

Re: opencv3.1によるtracking

#6

投稿記事 by Math » 1年前

[雑談]OpenCV3.2.0も(3.1も)<opencv2/tracking.hpp> の部分がわからない。C#もC++と似ているので類推出来るのですがtrackingの部分は不明です?。
「OpenCvSharp3 3.2.0」

コード: 全て選択

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.Blob;
using OpenCvSharp.Detail;
using OpenCvSharp.Extensions;
using OpenCvSharp.Face;
using OpenCvSharp.Flann;
using OpenCvSharp.Gpu;
using OpenCvSharp.ML;
using OpenCvSharp.UserInterface;
using OpenCvSharp.Util;
using OpenCvSharp.XFeatures2D;
//[003]---3rd---3rd.Sample---33333333333333333333333333333333333333333---
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat img=Cv2.ImRead("d:/dat/lenna.png");//画像読み込み
            Cv2.NamedWindow("img");
            Cv2.ImShow("img", img);//画像表示
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

アバター
usao
記事: 1369
登録日時: 5年前

Re: opencv3.1によるtracking

#7

投稿記事 by usao » 1年前

>おっしゃる通り、76~79行目の値を用いたinit()を行おうとしております。

それで解決したのか否かを明確にしていただきたい.

syokkupan
記事: 4
登録日時: 1年前

Re: opencv3.1によるtracking

#8

投稿記事 by syokkupan » 1年前

>それで解決したのか否かを明確にしていただきたい.

まだ解決していません。

閉鎖

“C言語何でも質問掲示板” へ戻る