반응형

 

 

간단히 Meanshift  이론을 설명하고 webcam과 video 영상에 ROI를 지정하여 동작하도록 C++로 작성된 Meanshift 예제 코드를 동작시켜 봅니다. 

  

2019. 7. 2

2019. 7. 29 히스토그램생성시 Hue만 사용하도록 수정

 

 

 

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


// 아래 줄을 주석처리하면 비디오 영상에 대해 동작 
//#define WEBCAM 



bool mouse_is_pressing = false;
int start_x, start_y, end_x, end_y;
int step = 0;
Mat img_color;
Rect roi;


void swap(int* v1, int* v2) {
	int temp = *v1;
	*v1 = *v2;
	*v2 = temp;
}


void mouse_callback(int event, int x, int y, int flags, void* userdata)
{
	Mat img_result = img_color.clone();


	if (event == EVENT_LBUTTONDOWN) {
		step = 1;

		mouse_is_pressing = true;
		start_x = x;
		start_y = y;



	}
	else if (event == EVENT_MOUSEMOVE) {

		if (mouse_is_pressing) {

			end_x = x;
			end_y = y;

			step = 2;
		}

	}
	else if (event == EVENT_LBUTTONUP) {

		mouse_is_pressing = false;

		end_x = x;
		end_y = y;

		step = 3;
	}
}


int main()
{
	Mat img_hsv, img_mask, img_ROI;
	Mat objectHistogram;


	int channels[] = { 0 };
	int hsize[] = { 64};
	float range1[] = { 0, 180 };
	const float* histRange[] = { range1 };


#ifdef WEBCAM 
	VideoCapture cap(0);
#else
	VideoCapture cap("note.mp4");
#endif

	if (!cap.isOpened()) {
		cerr << "video 에러 - 카메라 또는 영상을 열 수 없습니다.\n";
		return -1;
	}

	namedWindow("Color", 1);
	setMouseCallback("Color", mouse_callback);

#ifndef WEBCAM
	Mat img_sceen;
	cap.read(img_sceen);
#endif


	while (1)
	{

#ifdef WEBCAM
		cap.read(img_color);
#else
		if (step == 4)
			cap.read(img_color);
		else
			img_sceen.copyTo(img_color);
#endif

		if (img_color.empty()) {
			cerr << "빈 영상이 캡쳐되었습니다.\n";
			break;
		}

		switch (step)
		{

		case 1:
			circle(img_color, Point(start_x, start_y), 10, Scalar(0, 255, 0), -1);

			break;

		case 2:
			rectangle(img_color, Point(start_x, start_y), Point(end_x, end_y), Scalar(0, 255, 0), 3);

			break;

		case 3:

			if (start_x > end_x) {
				swap(&start_x, &end_x);
				swap(&start_y, &end_y);
			}

			roi = Rect(start_x, start_y, end_x - start_x, end_y - start_y);
			cvtColor(img_color, img_hsv, COLOR_BGR2HSV);
			img_ROI = Mat(img_hsv, roi);

			inRange(img_ROI, Scalar(0., 60., 60.), Scalar(180., 255., 255.), img_mask);

			imshow("ROI", img_ROI);

			calcHist(&img_ROI, 1, channels, img_mask, objectHistogram, 1, hsize, histRange);
			normalize(objectHistogram, objectHistogram, 0, 255, NORM_MINMAX);

			step++;

			break;

		case 4:

			Mat bp;
			cvtColor(img_color, img_hsv, COLOR_BGR2HSV);
			calcBackProject(&img_hsv, 1, channels, objectHistogram, bp, histRange);

			// Tracking
			meanShift(bp, roi, TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1));

			rectangle(img_color, roi, Scalar(0, 0, 255), 2);
			break;

		}


		//if (step < 4)
		cout << step << endl;

		imshow("Color", img_color);


		if (waitKey(25) >= 0)
			break;
	}


	return 0;
}

 

반응형

진행해본 결과물을 기록 및 공유하는 공간입니다.
잘못된 부분이나 개선점을 알려주시면 반영하겠습니다.


소스코드 복사시 하단에 있는 앵커 광고의 왼쪽 위를 클릭하여 닫은 후 해야 합니다.


문제가 생기면 포스트와 바뀐 환경이 있나 먼저 확인해보세요.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

TistoryWhaleSkin3.4">