как автоматически щелкать видео мышкой каждые 10 секунд c, Python - PullRequest
1 голос
/ 19 февраля 2020

Мой алгоритм страдает от изменения освещенности, которое зависит от отслеживания цвета в помещении. Итак, я хотел бы обновлять нижнее и верхнее значения ВПГ каждые 10 секунд, используя автоматическое нажатие мышью. Я использую Python, OpenCV для отслеживания цвета роботом.

Желаемая область для нажатия на него, например (320, 240) пикселей.

Полный код:

import cv2
import numpy as np
import time


class ColorTracker(object):
    # path = "../videos/ball.mp4"
    path = 0  # set the path of video to load and for primary camera keep it 0, for second camera 1 and so on.
    hue_tolerance = 10

    mouse_clicked = False
    frame = np.zeros((480, 640, 3), np.uint8)
    b, g, r = 0, 0, 0
    cx, cy = 0, 0
    cap = None
    color_lower_range = (0, 0, 0)
    color_higher_range = (0, 0, 0)

    def __init__(self):
        self.cap = cv2.VideoCapture(self.path)
        cv2.namedWindow("Color Tracker")
        cv2.setMouseCallback('Color Tracker', self.getCoords)

    def getCoords(self, event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            self.cx, self.cy = x, y

            self.b, self.g, self.r = self.frame[self.cy, self.cx]
            self.b, self.g, self.r = int(self.b), int(self.g), int(self.r)

            frame_hsv = cv2.cvtColor(self.frame, cv2.COLOR_BGR2HSV)
            h, s, v = frame_hsv[self.cy, self.cx]
            h, s, v = int(h), int(s), int(v)
            print(h, s, v)

            h_low = h - self.hue_tolerance
            h_high = h + self.hue_tolerance
            if h_low < 0:
                h_low = 0
            if h_high > 179:
                h_high = 179

            s_low = s - 10
            s_high = s + 10
            if s_low < 0:
                s_low = 0
            if s_high > 255:
                s_high = 255

            v_low = v - 15
            v_high = v + 15
            if v_low < 0:
                v_low = 0
            if v_high > 255:
                v_high = 255

            self.color_lower_range = (h_low, 100, 100)
            self.color_higher_range = (h_high, 255, 255)

            if s < 100:
                self.color_lower_range = (h_low, s_low, 100)
                self.color_higher_range = (h_high, s_high, 255)
            if v < 100:
                self.color_lower_range = (h_low, 100, v_low)
                self.color_higher_range = (h_high, 255, v_high)
            if s < 100 and v < 100:
                self.color_lower_range = (h_low, s_low, v_low)
                self.color_higher_range = (h_high, s_high, v_high)

            self.mouse_clicked = True

    def start(self):
        while (True):
            available, self.frame = self.cap.read()

            # frame = cv2.flip(frame,1)
            if not self.mouse_clicked:
                cv2.imshow("Color Tracker", self.frame)
            else:
                frame_hsv = cv2.cvtColor(self.frame, cv2.COLOR_BGR2HSV)
                # cv2.imshow("frame_hsv",frame_hsv)
                mask = cv2.inRange(frame_hsv, self.color_lower_range, self.color_higher_range)
                # cv2.imshow("mask",mask)
                mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
                blur = cv2.GaussianBlur(mask, (3, 3), 0)
                gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
                edged = cv2.Canny(gray, 30, 200)
                img2, contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
                cv2.drawContours(self.frame, contours, -1, (0, 255, 0), 3)
                cv2.rectangle(self.frame, (5, 5), (20, 20), (self.b, self.g, self.r), -1)
                cv2.imshow("Color Tracker", self.frame)

            if cv2.waitKey(100) == 13:
                break

    def end(self):
        self.cap.release()
        cv2.destroyAllWindows()


CT = ColorTracker()
CT.start()
CT.end()

просьбы помочь или любые предложения

...