Как получить координаты экрана из результирующей области определения цвета, полученной из openCV с python?
Я пытаюсь работать с ручкой, имеющей зеленый кончик колпачка, для перемещения курсора мыши с помощью веб-камеры, но как мне получить координаты изображения колпачка на экране, чтобы я мог передать его в качестве входных данных для функции перемещения библиотеки 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()
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 и (по крайней мере, разрешения, которые я написал вручную) по ширине и высоте... возможно, вам придется адаптировать код, чтобы справиться с этим, если это необходимо:)
Если у вас есть какие-либо вопросы, просто оставьте комментарий