【问题标题】:Mouse callback event flags in Python/OpenCV/OSX?Python/OpenCV/OSX 中的鼠标回调事件标志?
【发布时间】: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_CTRLKEYflags == cv2.EVENT_FLAG_SHIFTKEY 都总是错误的。

有什么想法吗?我是否错误地使用了事件标志? OS X 编码键/右键单击的方式有问题吗?我该如何解决?


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

【问题讨论】:

    标签: python opencv callback mouseevent keyboard-events


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      我建议打印您获得的“标志”值,并与存储在 cv2.EVENT_FLAG_SHIFTKEY 中的值进行比较。

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

      同样,cv2.EVENT_FLAG_CTRLKEY 存储 8L,但我得到 9 作为标志参数。所以,可能 cv2 接口中存在一些错误。可能还有 Mac 版本。

      (编辑) 2.4.12 似乎已经修复了这个问题。

      【讨论】:

      • 谢谢!这就是问题所在。
      • 很高兴知道它很有帮助。那你也能接受答案吗?
      【解决方案3】:

      我知道这是一个老问题,但我刚刚解决了这个问题,并想分享我的解决方案:

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

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

      而不仅仅是

      flags == cv2.EVENT_FLAG_SHIFTKEY

      这对我有用。

      也就是说,我也拿不到

      events == cv2.EVENT_RBUTTONDOWN

      在 MAC OS X 上工作。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        相关资源
        最近更新 更多