0

我正在尝试根据鼠标事件在帧上绘制一个矩形,问题是当我有视频流时我不能这样做,程序崩溃是我的代码:

  cv::Rect theBox;
   bool drawing_box = false;

  void draw_box(Mat* frame, cv::Rect rectangle){
cvRectangle( frame, cvPoint(theBox.x, theBox.y), cvPoint   heBox.x+theBox.width,theBox.y+theBox.height),
            cvScalar(0xff,0x00,0x00) );

} void mouse(int event, int x, int y ,int flags, void* parameter){

Mat* image = (Mat*) parameter;

switch( event ){
    case CV_EVENT_MOUSEMOVE: 
        if( drawing_box ){
            theBox.width = x-theBox.x;
            theBox.height = y-theBox.y;
        }
        break;

    case CV_EVENT_LBUTTONDOWN:
        drawing_box = true;
        theBox = cvRect( x, y, 0, 0 );
        break;

    case CV_EVENT_LBUTTONUP:
        drawing_box = false;
        if( theBox.width < 0 ){
            theBox.x += theBox.width;
            theBox.width *= -1;
        }
        if( theBox.height < 0 ){
            theBox.y += theBox.height;
            theBox.height *= -1;
        }
        draw_box( image, theBox );
        //cv::rectangle(parameter, theBox, CV_RGB(255,0,0));
        break;
}

}

int  main(){

    cv::Mat frame;
    int key = 0 ;
    const char* name = "box";
    theBox = Rect(-1,-1,0,0);
    cv::VideoCapture cap(1);

    if (!cap.isOpened()){
        cout<< " capture isn't open " << endl;
        return -1;
    }

    cv::namedWindow(name);

    while (key != 27){

        cap >> frame;
        cv::imshow(name,frame);
        cv::setMouseCallback(name,mouse,&frame);

        key = cv::waitKey(1);
    }

    cv::destroyAllWindows();

return 0;

}

4

1 回答 1

0

当视频流发生时,显示正在更新......同时尝试绘制矩形很困难......因为矩形是根据鼠标移动的输入绘制的,并且鼠标移动是独立的流视频帧...因此矩形可能会被覆盖(但不应该崩溃)。您可以尝试在视频帧显示的每次迭代中在视频帧上绘制一个透明(大小基于鼠标移动事件......)屏幕......

于 2013-01-10T11:29:00.680 回答