ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추적 (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, &param);

        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
Designed by Tistory.