OpenCV 강좌 - Camshift 이론과 C++ 예제(Camshift example code in C++)OpenCV/OpenCV 강좌2019. 7. 30. 09:12
Table of Contents
반응형
간단히 Camshift 이론을 설명하고 webcam과 video 영상에 ROI를 지정하여 동작하도록 C++로 작성된 Camshift 예제 코드를 동작시켜 봅니다.
#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, mask_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("train.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);
inRange(img_hsv, Scalar(0., 30., 30.), Scalar(180., 255., 255.), img_mask);
img_ROI = Mat(img_hsv, roi);
mask_ROI = Mat(img_mask, roi);
imshow("ROI", img_ROI);
calcHist(&img_ROI, 1, channels, mask_ROI, 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);
//calcBackProject(&img_hsv, 1, 0, objectHistogram, bp, histRange);
//dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
bp &= img_mask;
// Tracking
//bitwise_and(bp, img_mask, bp);
RotatedRect rot_rect = CamShift(bp, roi, TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1));
if( roi.area() <= 1 )
{
int cols = bp.cols, rows = bp.rows, r = (MIN(cols, rows) + 5)/6;
roi = Rect(roi.x - r, roi.y - r,
roi.x + r, roi.y + r) &
Rect(0, 0, cols, rows);
}
ellipse( img_color, rot_rect, Scalar(0,0,255), 3, LINE_AA );
Point2f vertices[4];
rot_rect.points(vertices);
for (int i = 0; i < 4; i++)
line(img_color, vertices[i], vertices[(i+1)%4], Scalar(0,255,0), 2);
break;
}
//if (step < 4)
cout << step << endl;
imshow("Color", img_color);
if (waitKey(25) >= 0)
break;
}
return 0;
}
반응형
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV를 사용하여 책 검출하기(book detection with OpenCV) (1) | 2019.09.17 |
---|---|
OpenCV 강좌 C++ & Python - 컨투어 영역에 텍스쳐 넣기(applying texture in a contour area) (2) | 2019.08.18 |
OpenCV에서 이미지의 픽셀에 접근하는 방법 (29) | 2019.07.18 |
OpenCV 강좌 - Meanshift 이론과 C++ 예제(meanshift example code in C++) (24) | 2019.07.04 |
OpenCV 예제 - 웹캠 영상에 실시간 ROI 하기( Select ROI on Real Time webcam video) (19) | 2019.07.01 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!