我试图在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;
}
请帮忙吗?
答案 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);
,如果变量名称应该是直观的