Python/OpenCV/OSX 中的鼠标回调事件标志?

Mouse callback event flags in Python/OpenCV/OSX?

我在 OS X (10.10.5) 上的 Python 中使用 OpenCV。我才刚刚起步,所以我可能在这里犯了一个愚蠢的错误。但是,我还没有找到任何解决此问题的方法。

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

现在我想使用鼠标回调函数中的标志来控制是将坐标追加到列表还是改为追加 ('NA', 'NA')。例如,如果图像中缺少一个点,我可以按住 shift 键并单击图像,然后会附加一个占位符而不是坐标。

虽然鼠标回调的 event 部分有效*,但 flags 信息似乎不可用。

鼠标回调函数如下:

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_* 信息)对函数不可用。

如果我以不同的方式更改代码,会发生以下情况:

知道这里出了什么问题吗?我是否错误地使用了事件标志? OS X 编码 keys/right 点击的方式有问题吗?我该如何解决?


* 附加说明:实际上,事件 EVENT_LBUTTONDOWN 是唯一有效的事件。与此类似 post、Mouse event handling with cvSetMouseCallbackEVENT_RBUTTONDOWN 并且双击事件不起作用(双击注册为两次单击并附加两组坐标)。我用触控板和外接鼠标都试过了(另一个 post 的答案没有解决问题)。

我遇到了类似的问题,简单的打印语句调试帮助我解决了问题。

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

在我的例子中,我使用的是 Windows 7 opencv 2.4.9 并且 cv2.EVENT_FLAG_ALTKEY 是 32L 但返回的实际标志参数是 33.

类似地,cv2.EVENT_FLAG_CTRLKEY 存储 8L,但我得到 9 的标志参数。因此,cv2 接口中可能存在一些错误。 Mac 版本也有可能。

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

我知道这是一个老问题,但我刚开始使用它并想分享我的解决方案:

我认为 flags 注册 shift 点击的方式不仅仅是使用 flag 本身,你还需要为点击添加 flag。我的意思是你需要使用:

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

而不只是

flags == cv2.EVENT_FLAG_SHIFTKEY

这对我有用。

也就是说,我也搞不懂

events == cv2.EVENT_RBUTTONDOWN

在 MAC OS X 上工作。

希望对您有所帮助!

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

if event == cv2.EVENT_LBUTTONDBLCLK and (flags & cv2.EVENT_FLAG_CTRLKEY):