-
추적 (Tracking) 코드컴공지식/컴퓨터비전 2024. 10. 28. 22:27
마우스로 드래그하여 추적 영역을 설정한다.
MeanShift / CamShift 적용된거다.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
struct CallbackParam {
Mat frame;
Point pt1, pt2;
Rect roi;
bool drag = false;
bool updated = false;
};
void onMouse(int event, int x, int y, int flags, void* param) {
CallbackParam *p = (CallbackParam *)param;
if (event == EVENT_LBUTTONDOWN) {
p->pt1 = p->pt2 = Point(x, y);
p->drag = true;
} else if (event == EVENT_LBUTTONUP) {
p->roi = Rect(p->pt1, Point(x, y));
p->drag = false;
p->updated = (p->roi.width >= 10 && p->roi.height >= 10);
} else if (p->drag && event == EVENT_MOUSEMOVE) {
p->pt2 = Point(x, y);
Mat img = p->frame.clone();
rectangle(img, p->pt1, p->pt2, Scalar(0, 255, 0), 1);
imshow("Tracker", img);
}
}
int main() {
VideoCapture cap(0);
if (!cap.isOpened()) {
cout << "Can't open camera" << endl;
return -1;
}
CallbackParam param;
cap >> param.frame;
imshow("Tracker", param.frame);
setMouseCallback("Tracker", onMouse, ¶m);
Mat hsv, m_backproj;
Mat m_model3d;
bool tracking = false;
// HSV 색 범위 지정 (Hue, Saturation, Brightness)
float hrange[] = { 0, 180 };
float srange[] = { 0, 255 };
float vrange[] = { 0, 255 };
const float* ranges[] = { hrange, srange, vrange };
int channels[] = { 0, 1, 2 };
int hist_sizes[] = { 16, 16, 16 };
while (true) {
cap >> param.frame;
if (parahttp://m.frame.empty()) break;
// BGR -> HSV 색 변환
cvtColor(param.frame, hsv, COLOR_BGR2HSV);
if (param.updated) {
// ROI가 설정된 경우, 히스토그램 계산
Mat roi(hsv, param.roi);
Mat mask = Mat::zeros(parahttp://m.roi.size(), CV_8U);
ellipse(mask, Point(mask.cols / 2, mask.rows / 2),
Size(mask.cols / 2, mask.rows / 2), 0, 0, 360, 255, FILLED);
// 히스토그램 생성
calcHist(&roi, 1, channels, mask, m_model3d, 3, hist_sizes, ranges);
normalize(m_model3d, m_model3d, 0, 255, NORM_MINMAX);
param.updated = false;
tracking = true;
}
if (tracking) {
// 히스토그램 역투영 (추적 대상의 위치를 찾음)
calcBackProject(&hsv, 1, channels, m_model3d, m_backproj, ranges);
// **MeanShift 추적** 적용
meanShift(m_backproj, param.roi,
TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1));
rectangle(param.frame, param.roi, Scalar(0, 0, 255), 3);
// 또는 **CamShift 추적** 적용
// RotatedRect rot_rect = CamShift(m_backproj, param.roi,
// TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 20, 1));
// rectangle(param.frame, rot_rect.boundingRect(), Scalar(0, 0, 255), 3);
}
// 결과 출력
imshow("Tracker", param.frame);
// ESC 키 입력 시 종료
if (waitKey(33) == 27) break;
}
return 0;
}'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
YOLO 모델 로딩하는 코드 (0) 2024.11.04 Optical Flow (광류 추적) 코드 (1) 2024.10.28 얼굴 인식 코드 (1) 2024.10.28 Tracking(추적)이란? (2) 2024.10.28 Face Detection (2) 2024.10.28