无法在OpenCV for python中获得双击事件

时间:2015-12-30 14:19:49

标签: opencv python-3.x

使用python的OpenCV(MAC OS X EL Capitan)

我正在创建一个演示项目来跟踪openCV中的鼠标事件。使用openCV中的标准mouseCallback。

以下是我的相同代码。

drawWithMouse.py

#!/usr/local/bin/local/python3
import numpy as np
import cv2 as cv

#Mouse callback function
def draw_shape(event,x,y,flags,param):
    print("event : ",event)
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img,(x,y),100,(255,0,0),-1)

#Create a black image, a window and bind the function to the window
img = np.zeros((780,780,3),np.uint8)
cv.namedWindow('DrawWithMouse')
cv.setMouseCallback('DrawWithMouse',draw_shape)

while(1):
    cv.imshow('DrawWithMouse',img)
    if cv.waitKey(10) & 0xFF == 27: #ANDing with 0xFF as my machine is 64 bit
        break

cv.destroyWindow('DrawWithMouse')

通过这种实现,我总是得到鼠标按下和mouseup事件,只有单击事件。我无法获得双击事件(EVENT_LBUTTONDBLCLK)。这个常数的值是7。

我得到了以下输出event : 1 is mouse down and event: 4 is mouse up

6 个答案:

答案 0 :(得分:1)

您可以尝试使用时间测量来解决问题,例如time.clock()(不精确但最简单)以及click和previous之间的时差计算。如果时间小于阈值,则执行双击操作。

time =0
thresh = 1
#Mouse callback function
def draw_shape(event,x,y,flags,param):
  print("event : ",event)
  if event == cv.EVENT_LBUTTONDBLCLK:
    if time.clock - time < thresh:
       //double click
    time = time.clock()
    cv.circle(img,(x,y),100,(255,0,0),-1)

答案 1 :(得分:0)

我刚试过运行你的代码,对我来说一切似乎都很好。我点击向下按住一个1,我释放并且有一个4.当我双击时有一个7.但是如果鼠标移动则不起作用。双击鼠标时尝试保持鼠标静止,或尝试另一只鼠标Terminal is in the bottom right

答案 2 :(得分:0)

我刚从El Capitan for Python 3下载了opencv-python,因为我没有它:

正在下载opencv_python-3.3.0.10-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl(43.8MB)

运行示例代码并左键双击工作正常,创建大量蓝色圆圈。然后我试图让它失败。我发现唯一接近的是将双击速度设置为系统偏好设置/鼠标中的最高标记:

enter image description here

我发现最高设置和第二高设置之间存在显着差异。使用快速或慢速搜索网络可能会很麻烦,双击。

您是否确认双击一般?虽然我目前找不到它,但我相信曾经有一些设置可以将双击转换成两次单击和其他潜在的Macintosh怪癖。 X-Windows是否与您的设置有任何关系?

祝你好运。

答案 3 :(得分:0)

对于像我这样想要copy-paste的人:

import time

last_time = None

def double_click(self, event, x, y, flags, params)
    """handle double click"""
    if event == cv2.EVENT_LBUTTONDOWN:

        if last_time is not None and time.time() - last_time < 1:
            cv2.circle(img, (x, y), 20, (255, 0, 0), 2)
           last_time = None
        else:
           last_time = time.time()

设置回调时,您可以使用最后一个参数params传递帧:

cv2.setMouseCallback("image", double_click, img)

答案 4 :(得分:0)

临时的简单技巧(直到有人提出真实答案):

将事件从“ EVENT_LBUTTONDBLCLK”更改为任何非双击事件(例如“ EVENT_LBUTTONDOWN”)

答案 5 :(得分:0)

ENV:macOS High Sierra,OpenCV 3.4,Python 3.7.0

遇到同样的问题。 尝试过Apple Magic Pad /罗技无线鼠标,结果相同。

在macOS中调整鼠标单击速度的首选项没有帮助。

只需将所需事件从(EVENT_LBUTTONDBLCLK)更改为(EVENT_LBUTTONDOWN)即可。