我为OpenCV编写了一个非常简单的UI类(基于OpenCV矩阵上的绘图按钮),但OpenCV似乎有某种事件处理程序错误:
当我向下点击时,如果我点击太快,上下第二次向下点击事件将不会被捕获。然而,如果我点击向下、向上、向下和向上,尽管第二个向下仍然被忽略,但无论我尝试点击多快,第二个向上事件都会被捕获
调试输出(1=向下,-1=向上):
Button: 1 //slow clicks
Button: -1
Button: 1
Button: -1
Button: 1
Button: -1
Button: 1
Button: -1
Button: 1 //started clicking fast
Button: -1
Button: -1
Button: 1
Button: -1
Button: -1
Button: 1
Button: -1
Button: -1
Button: 1
因为我已经因为发布没有代码的问题而被否决了,这里有一些代码:
void Opencv_UI::event_process(int evt, int x, int y, int flags)
{
int button = 0;
switch(evt)
{
case CV_EVENT_LBUTTONDOWN : button=1; break;
case CV_EVENT_LBUTTONUP : button=-1; break;
case CV_EVENT_RBUTTONDOWN : button=3; break;
case CV_EVENT_RBUTTONUP : button=-3; break;
}
if(button==1||button==-1)
std::cout<<"Button: "<<button<<"n";
//Code below does not affect event performance, I tryed the script with all this commented out
int button_count = buttons.size();
for(int i=0; i<button_count; i++) //Informs buttons about mouse event
{
buttons[i]->mouse(x, y, button);
}
this->render(); //Renders buttons affected by click/mousemove
}
原来,当检测到双击时,发送了不同的事件,因此发送了CV_EVENT_LBUTTONDBLCLK
常量
开关应该是这样的:
switch(evt)
{
case CV_EVENT_LBUTTONDBLCLK : //Capture doubleclick too
case CV_EVENT_LBUTTONDOWN : button=1; break;
case CV_EVENT_LBUTTONUP : button=-1; break;
case CV_EVENT_RBUTTONDOWN : button=3; break;
case CV_EVENT_RBUTTONUP : button=-3; break;
}