2

我正在尝试使用具有绿色帽尖的笔来使用网络摄像头导航鼠标光标,但是如何在屏幕上获取帽图像的坐标,以便我可以将其作为 pyinput 库移动功能的输入。

提前致谢。

# Python program for Detection of a
# specific color(green here) using OpenCV with Python

import cv2
import numpy as np
import time

cap = cv2.VideoCapture(0)


while (1):
    # Captures the live stream frame-by-frame

    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_red = np.array([75, 50, 50])
    upper_red = np.array([100, 255, 255])
    mask = cv2.inRange(hsv, lower_red, upper_red)
    res = cv2.bitwise_and(frame, frame, mask=mask)
    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)

    **#code to output coordinates of green pen tip**

    k = cv2.waitKey(5) & 0xff
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()
4

1 回答 1

1

你拥有所有你需要的东西,只需要几个步骤:

首先找到你的面具中的非零点,它应该代表小费。

points = cv2.findNonZero(mask)

然后,您可以对它们进行平均,以获得代表尖端的“独特点”。

avg = np.mean(points, axis=0)

现在,您可以将其标准化为 0-1 值,以后可以在任何分辨率下使用...或者您可以直接将其标准化为屏幕分辨率...

# assuming the resolutions of the image and screen are the following
resImage = [640, 480]
resScreen = [1920, 1080]

# points are in x,y coordinates
pointInScreen = ((resScreen[0] / resImage[0]) * avg[0], (resScreen[1] / resImage[1]) * avg[1] )

需要考虑的几件事,首先要记住,opencv 坐标系原点位于左上角,指向下方和右侧。

 ---->
|
|   image
|
v

根据您使用这些点坐标的位置和方式,您可能需要翻转轴......

其次,在 OpenCV 中,点在 x,y 中,并且(至少我手动编写的分辨率)在宽度和高度中......如果需要,您可能必须调整代码以应对这种情况:)

如果您有任何问题,请发表评论

于 2018-01-08T08:50:14.310 回答