0

我想在视频暂停时使用鼠标绘制视频的一个区域,但我遇到了一个小问题。当我暂停视频并尝试绘制区域时,仅在我按下键盘上的任意键后才会出现绘制区域(未实现)。我想知道当我按下鼠标按钮时,我可以对出现的绘制区域做什么?

谢谢, : )

我的代码:

//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;
        }
}
4

1 回答 1

0

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

于 2013-08-27T14:28:51.897 回答