【发布时间】:2015-08-25 17:09:33
【问题描述】:
我在 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_* 信息)不适用于该函数。
如果我以不同方式更改代码会发生以下情况:
-
我没有包含任何关于标志的内容,点击的每个点的坐标都附加到
img_points,所以事件部分似乎没问题。 -
如果我使用上面写的函数,每个被点击的点的坐标(不管是否按下 shift 键)都会被附加。所以
flags != cv2.EVENT_FLAG_SHIFTKEY必须始终为真。 -
如果我使用上面编写的代码,但将
flags != cv2.EVENT_FLAG_SHIFTKEY替换为flags == cv2.EVENT_FLAG_CTRLKEY,那么无论我是否按住任何按钮,当我单击时都不会发生任何事情。这表明无论我用键盘做什么,flags == cv2.EVENT_FLAG_CTRLKEY和flags == cv2.EVENT_FLAG_SHIFTKEY都总是错误的。
有什么想法吗?我是否错误地使用了事件标志? OS X 编码键/右键单击的方式有问题吗?我该如何解决?
* 附加说明:实际上,事件EVENT_LBUTTONDOWN 是唯一有效的事件。与这篇文章类似,Mouse event handling with cvSetMouseCallback、EVENT_RBUTTONDOWN 和双击事件不起作用(双击注册为两次单击并附加两组坐标)。我用触控板和外接鼠标都试过了(其他帖子的答案没有解决问题)。
【问题讨论】:
标签: python opencv callback mouseevent keyboard-events