使用鼠标使用OpenCV绘制视频区域



我想在视频暂停时用鼠标绘制视频的一个区域,但我遇到了一个小问题。当我暂停视频并尝试绘制区域时,绘制的区域只有在我按下键盘上的任何键后才会出现(这并没有实现)。我想知道当我按下鼠标按钮时,我能对出现的绘画区域做些什么?

谢谢,:)

我的代码:

//mouse callback
void rotina_mouse(int event, int x, int y, int flags, void* param);
bool continua = false;
//function to paint
void pinta(IplImage* image, int x, int y){
     cvFloodFill (image, cvPoint (x,y), cvScalar(103), cvScalarAll(2), cvScalarAll(2), 0, CV_FLOODFILL_FIXED_RANGE , 0);
}
//main program
int _tmain(int argc, _TCHAR* argv[])
{
    cvNamedWindow ("saida", CV_WINDOW_AUTOSIZE);
    CvCapture* g_capture  = cvCreateFileCapture ("vid.avi");
    IplImage* frame = cvQueryFrame(g_capture);
    IplImage* temp = cvCloneImage( frame );
    cvSetMouseCallback("saida",rotina_mouse,(void*) frame);
    while(1){
        frame = cvQueryFrame(g_capture);    
        cvNot(frame, frame);
        cvCopyImage( frame, temp );
        cvShowImage("saida", temp);
        if(!frame) break;
        //pause with 'p'
        char e = cvWaitKey(33);
        if(e==112){
        while(1){
            cvCopyImage( frame, temp );
            cvShowImage("saida", temp);
            char d = cvWaitKey(0);
            if(d==112) break;
        }
        }
        //close video with'esc'
        if(e==27) break;
    }
    cvReleaseCapture (&g_capture);
    cvDestroyWindow("saida");
    return 0;   
}
//mouse callback
void rotina_mouse(int event, int x, int y, int flags, void* param) {
    IplImage* image = (IplImage*) param;
        switch( event ) {
            case CV_EVENT_MOUSEMOVE: {
                    if(continua==true)
                    pinta(image, x, y);         
            }
            break;
            case CV_EVENT_LBUTTONDOWN: {
                pinta(image, x, y);
                continua=true;
            }
            break;
            case CV_EVENT_LBUTTONUP: {
                continua=false;
            }
            break;
            default:
            break;
        }
}

调用cv::imshow(从回调内部)。

最新更新