Как получить координаты ограничительной рамки ROI без «Угадай и проверь» - PullRequest
2 голосов
/ 13 марта 2019

Итак, я пытаюсь сделать снимок экрана моего монитора и при этом захватить только часть экрана.Я знаю, что могу использовать mss или opencv, подушку или любую другую библиотеку скриншотов, которая поддерживает ограничивающие прямоугольники ... Однако, вместо того, чтобы случайно угадывать координаты ... и я имею в виду снимок экрана с координатами ограничивающего прямоугольникаустановить и посмотреть, не приблизится ли это к тому, что я на самом деле пытаюсь получить.


Например: мои пробные координаты будут 10,10500,500, тогда как на самом деле мои фактические координаты мне нужны15,40,200,300 (эти координаты составлены)


Моя идея решить эту проблему - использовать инструмент, который позволяет мне щелкать и перетаскивать ограничивающий прямоугольник вокруг изображения (часть экрана)), что мне нужно, и программа выдаст результаты, например, 15,40,200,300. A Также, если бы я мог нарисовать прямоугольник, как показано, это было бы действительно полезно!Если есть другой способ достижения этой цели, я тоже буду к этому открыт.


Спасибо.

1 Ответ

0 голосов
/ 14 марта 2019

Идея состоит в том, чтобы щелкнуть и перетащить ограничивающий прямоугольник вокруг интересующей области, чтобы получить координаты. Для этого мы должны зафиксировать действия по событию щелчком мыши и записать начальную и конечную координаты области интереса. OpenCV позволяет нам делать это, обрабатывая события щелчка мышью. Каждый раз, когда срабатывает событие щелчка мыши, OpenCV передает информацию нашей функции обратного вызова extract_coordinates. Для обработки события OpenCV требует различных аргументов:

  • событие : событие, которое имело место (нажатие влево / вправо или отпускание мыши)
  • x : X-координата события
  • y : Y-координата события
  • flags : Соответствующие флаги переданы OpenCV
  • Параметры : дополнительные параметры, передаваемые OpenCV

Нажатие левой кнопки мыши записывает координаты левого верхнего угла, а нажатие левой кнопки мыши записывает нижние правые координаты Затем мы рисуем ограничивающую рамку вокруг области интереса и печатаем координаты верхнего левого и нижнего правого прямоугольного региона на консоли. Щелчок правой кнопкой мыши сбросит изображение.

Bounding Box coordinates

Извлечение виджета координат ограничивающего прямоугольника:

import cv2

class ExtractImageWidget(object):
    def __init__(self):
        self.original_image = cv2.imread('placeholder.PNG')

        # Resize image, remove if you want raw image size
        self.original_image = cv2.resize(self.original_image, (640, 556))
        self.clone = self.original_image.copy()

        cv2.namedWindow('image')
        cv2.setMouseCallback('image', self.extract_coordinates)

        # Bounding box reference points and boolean if we are extracting coordinates
        self.image_coordinates = []
        self.extract = False

    def extract_coordinates(self, event, x, y, flags, parameters):
        # Record starting (x,y) coordinates on left mouse button click
        if event == cv2.EVENT_LBUTTONDOWN:
            self.image_coordinates = [(x,y)]
            self.extract = True

        # Record ending (x,y) coordintes on left mouse bottom release
        elif event == cv2.EVENT_LBUTTONUP:
            self.image_coordinates.append((x,y))
            self.extract = False
            print('top left: {}, bottom right: {}'.format(self.image_coordinates[0], self.image_coordinates[1]))

            # Draw rectangle around ROI
            cv2.rectangle(self.clone, self.image_coordinates[0], self.image_coordinates[1], (0,255,0), 2)
            cv2.imshow("image", self.clone) 

        # Clear drawing boxes on right mouse button click
        elif event == cv2.EVENT_RBUTTONDOWN:
            self.clone = self.original_image.copy()

    def show_image(self):
        return self.clone

if __name__ == '__main__':
    extract_image_widget = ExtractImageWidget()
    while True:
        cv2.imshow('image', extract_image_widget.show_image())
        key = cv2.waitKey(1)

        # Close program with keyboard 'q'
        if key == ord('q'):
            cv2.destroyAllWindows()
            exit(1)
...