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

Если у вас есть какие-либо вопросы, просто оставьте комментарий

Другие вопросы по тегам