openv中基于MouseEvent的绘图

Drawing based on MouseEvent in opencv

本文关键字:绘图 MouseEvent openv      更新时间:2023-10-16

我试图根据鼠标事件在帧上画一个矩形,问题是当我得到视频时我不能这样做,程序崩溃了这是我的代码:

  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) );

}无效鼠标(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;

}

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