python / opencv / OSX中的鼠标回调事件标志?

时间:2015-08-25 17:09:34

标签: python opencv callback mouseevent keyboard-events

我在OSX上的python中使用OpenCV(10.10.5)。我刚刚开始,所以我可能在这里犯了一个愚蠢的错误。但是,我还没有找到解决这个问题的任何内容。

我有一个鼠标回调函数,它创建一个列表,其中包含在加载的图像中单击的每个点的坐标。

现在我想使用鼠标回调函数中的标志来控制是否将坐标附加到列表中,或者我是否添加" NA,NA" (例如,如果图像中缺少一个点,我可以按住shift键并单击图像,并且将附加占位符而不是坐标)。

虽然"事件"部分鼠标回调工作*,"标志"信息似乎无法获得。

这里是鼠标回调函数:

img_points = []

def write_points(event, x, y, flags, param):
    global img_points
    if event == cv2.EVENT_LBUTTONDOWN and flags != cv2.EVENT_FLAG_SHIFTKEY:
        img_points.append((x,y))
        print img_points
    elif event == cv2.EVENT_LBUTTONDOWN and flags == cv2.EVENT_FLAG_SHIFTKEY:
        img_points.append(('NA','NA'))
        print img_points

我尝试过不同版本,据我所知,问题是event_flag_shiftkey(或任何其他event_flag信息)对函数不可用。

如果我以不同的方式改变代码会发生什么:

- 如果我没有包含任何关于标志的内容,则点击的每个点的坐标都会附加到img_points,因此事件部分似乎没问题。

- 如果我使用上面写的函数,则会附加点击的每个点的坐标(无论是否按下shift键)。所以flags!= cv2.EVENT_FLAG_SHIFTKEY必须始终为true。

- 如果我使用上面编写的代码,但是将flags!= cv2.EVENT_FLAG_SHIFTKEY替换为flags == cv2.EVENT_FLAG_CTRLKEY,那么无论我是否按住任何按钮,点击都没有任何反应。这表明无论我使用键盘做什么,flags == cv2.EVENT_FLAG_CTRLKEY和flags == cv2.EVENT_FLAG_SHIFTKEY都是假的。

这里有什么问题吗?我是否错误地使用了事件标志?这是OSX编码密钥/右键单击的方式有问题吗?我该如何解决?

*附加说明:实际上,事件EVENT_LBUTTONDOWN是唯一有效的事件。与this post类似,EVENT_RBUTTONDOWN和双击事件都不起作用。 (双击注册为两次单击并附加两组坐标)。我已经尝试使用触控板和外接鼠标。 (其他帖子的答案并没有解决问题)。

3 个答案:

答案 0 :(得分:1)

实际上你需要做一个按位和(&)因为按钮标志和键标志被添加(EG EVENT_FLAG_LBUTTONDOWN = 1加上EVENT_SHIFTKEY = 16)产生一个标志值17,所以作为捕获双左的示例在需要按下Control键时单击鼠标;

如果event == cv2.EVENT_LBUTTONDBLCLK和(flags& cv2.EVENT_FLAG_CTRLKEY):

答案 1 :(得分:0)

我有一个类似的问题,一个简单的打印语句调试帮助了我。

我建议打印"标志"你得到的值,并与存储在cv2.EVENT_FLAG_SHIFTKEY中的值进行比较。

在我的情况下,我使用的是Windows 7 opencv 2.4.9和cv2.EVENT_FLAG_ALTKEY是32L,但返回的实际flags参数是33。

同样,cv2.EVENT_FLAG_CTRLKEY存储8L但是我获得了9个标志参数。所以,cv2接口可能存在一些bug。可能也是Mac版本。

(编辑) 2.4.12似乎已经解决了这个问题。

答案 2 :(得分:0)

我知道这是一个老问题,但我刚开始工作,并认为我会分享我的解决方案:

我认为标记注册移位点击的方式不是单独使用标志,而是还需要为点击添加标志。我的意思是你需要使用:

flags == (cv2.EVENT_FLAG_SHIFTKEY + cv2.EVENT_FLAG_LBUTTON)

而不仅仅是

flags == cv2.EVENT_FLAG_SHIFTKEY

这对我有用。

那说,我也得不到

events == cv2.EVENT_RBUTTONDOWN

在MAC OS X上工作。

希望这有帮助!