opencv - 来自pynput的Mouse.position无法正常工作[python2,opencv,mac,jupyter]

标签 opencv position mouse move pynput

我对此并不陌生,因此它可能只是语法问题,但是没有人能弄清楚为什么77行mouse.position = (x,y)没有移动鼠标吗?通过将绿色对象举到我的网络摄像头,可以将其映射到绘制的点。

此外,当我介绍while mouse.position!=(x,y): pass时,引入绿色物体时相机会冻结。

此处的代码(冻结时未显示错误):

import cv2
import numpy as np
from pynput.mouse import Button, Controller
import wx

mouse=Controller()

#get monitor size
app=wx.App(False)
(sx,sy)=wx.GetDisplaySize()

print sx, sy

#output window size
(camx,camy)=(320,240)

#set filter limits
lowerBound=np.array([33,80,40])
upperBound=np.array([102,255,255])

#initialise cam
cam= cv2.VideoCapture(0)
cam.set(3,camx)
cam.set(4,camy)

#mask parameters
kernelOpen=np.ones((5,5))
kernelClose=np.ones((20,20))

while True:
    ret, img=cam.read()
    img=cv2.resize(img,(340,220))

    #convert BGR to HSV
    imgHSV= cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

    #create the Mask
    mask=cv2.inRange(imgHSV,lowerBound,upperBound)

    #morphology
    maskOpen=cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernelOpen)
    maskClose=cv2.morphologyEx(maskOpen,cv2.MORPH_CLOSE,kernelClose)

    maskFinal=maskClose

    #Find contours
    conts,h=cv2.findContours(maskFinal.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

    #For two contours (open):
    if(len(conts)==2):
        x1,y1,w1,h1=cv2.boundingRect(conts[0])
        x2,y2,w2,h2=cv2.boundingRect(conts[1])
        cv2.rectangle(img,(x1,y1),(x1+w1,y1+h1),(255,0,0),2)
        cv2.rectangle(img,(x2,y2),(x2+w2,y2+h2),(255,0,0),2)

        #finding points in middle of rectangles
        cx1=x1+w1/2
        cy1=y1+h1/2
        cx2=x2+w2/2
        cy2=y2+h2/2

        #find centre of line
        cx=(cx1+cx2)/2
        cy=(cy1+cy2)/2

        #create line between centres of contours
        cv2.line(img,(cx1,cy1),(cx2,cy2),(255,0,0),2)

        #create dot in middle of line
        cv2.circle(img, (cx,cy),2,(0,0,255),2)

        #to check values
        print (cx*sx/camx)
        print (cy*sy/camy)

        #move mouse to dot cx,cy (scaled for monitor)
        mouse.position = (cx*sx/camx,cy*sy/camy)
        while mouse.position != (cx*sx/camx,cy*sy/camy):
            pass

    #For one contour (closed):
    elif (len(conts)==1):
        x,y,w,h= cv2.boundingRect(conts[0])

        #draw single rectangle around 'clicked' object
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

        #show when clicked with large circle
        cx=x+w/2
        cy=y+h/2
        cv2.circle(img,(cx,cy),(w+h)/4,(0,0,255),2)

        #set mouse to dot cx,cy       
        mouse.position = (cx*sx/camx,cy*sy/camy)
        while mouse.position != (cx*sx/camx,cy*sy/camy):
            pass

    #cv2.imshow("maskClose",maskClose)
    #cv2.imshow("mask",mask)
    cv2.imshow("cam",img)
    cv2.waitKey(5)

感谢您的帮助!

最佳答案

我的问题是我需要允许终端和jupyter允许访问鼠标控件(Mac Mojave 10.14.2)。

冻结的原因是它被卡在while循环中-但使用mouse.position现在可以正常工作了!

关于opencv - 来自pynput的Mouse.position无法正常工作[python2,opencv,mac,jupyter],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54276605/

相关文章:

c# - 查找鼠标指针所在的监视器/屏幕

java - 如何使用opencv编辑图像以使用OCR读取文本

python - 如何可视化选择性搜索的分割图像?

html - CSS 工具提示不会拉伸(stretch),只能有固定宽度

java - 鼠标悬停在图像上时多个图像发生变化

javascript - 使用javascript触发页面缩放事件

python - 如何将 cv2.findHomography() 与压缩图像一起使用

c++ - 如何使用 opencv 保存包含多个直方图的文件?

javascript - 有没有办法以某种方式同时拥有绝对位置(底部)和同一 div 的多个并排?

javascript - jquery li位置返回零