opencv窗口在鼠标回调时没有刷新

时间:2015-06-22 14:35:04

标签: c++ opencv

我试图在opencv窗口中使用鼠标移动绘图。但是当我画画时,没有任何东西在窗户上画画。当我试图从topleft(ubuntu)中的十字架关闭窗口时,它会打开一个新窗口,应该是因为我没有按下逃生,在这个新窗口中,我能够看到我的绘图。我无法理解这个问题。我认为用鼠标回调刷新窗口有问题。这是代码......

bool drawing = false; //true if mouse is pressed
Mat img;

void draw(int event, int x, int y, int flags, void* param){
     if (event == CV_EVENT_LBUTTONDOWN){
        drawing = true;
    } else if (event == CV_EVENT_MOUSEMOVE){
        if (drawing) circle(img,Point(x,y),4,Scalar(255,255,255),-1);
    } else if (event == CV_EVENT_LBUTTONUP){
        drawing = false;
        circle(img,Point(x,y),2,Scalar(255,255,255),-1);
    }
}

int main(){
    // Create black empty images
    img = Mat::zeros(window_width, window_height, CV_8UC3);

    namedWindow( window_name, CV_WINDOW_AUTOSIZE );     // Create a window for display.
    setMouseCallback(window_name, draw, &img);          //set the callback function for any mouse event

    while(true){
        imshow(window_name, img);
        if (waitKey(0) == 27) break;
    }

    destroyAllWindows();
    return 0;
}

请帮忙吗?

1 个答案:

答案 0 :(得分:2)

你的代码适合我。

但你使用cv::waitKey(0)这意味着程序会在那里等到你按键盘键。因此,请在绘图后按键,或使用cv::waitKey(30)代替。

如果这对您没有帮助,请在回调函数中添加一些std::cout以验证它是否真的被调用。

btw,Mat::zeros(window_width, window_height, CV_8UC3);可能应该是Mat::zeros(window_height, window_width, CV_8UC3);,如果变量名称应该是直观的