В OpenCV RotatedRect нет атрибута «size» в Python3. Как обойти это? - PullRequest
0 голосов
/ 03 марта 2020

Я обнаружил, что .size.height и .size.width операторы класса OpenCV RotatedRect не работают в Python, тогда как они работают в C ++. Позвольте мне остановиться на упрощенном фрагменте кода:

cap = cv2.VideoCapture('video1.mp4')
filter = RandomClass(20)

while(cap.isOpened()):
    ret, frame = cap.read()              # Read a frame
    res = filter.classMain(frame)        # Process the frame
    if (res == 0):
        print('Success')                 # If processing completed, print Success
cap.release()

, где определение класса выглядит следующим образом:

import cv2
import numpy as np

class RandomClass:
    def __inti__(self):
        self.set_skip_first(True)
    def get_skip_first(self):
        return self.skip_first
    def set_skip_first(self, value):
        self.skip_first = value
    def classMain(self, frame):
        if not get_skip_first():
            self.expand_minRect(100)        # expand the minRect by 100 pixels
            # use the expanded rectangle for some other processing here
        else:
            self.set_skip_first(False)
        # create a mask with cv2.inRange
        contour = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE, offset=(0,0))[1]
        # iterate over each contour and find the index of the largest contour
        self.minRect = cv2.minAreaRect(np.array(self.contours[self.largest_contour_index]))
        # execute some other processing here
        return 0
    def expand_minRect(self, value):
        self.minRect.size.height = self.minRect.size.height + value
        self.minRect.size.width = self.minRect.size.width + value

Я получаю следующую ошибку. Точные строки прекрасно работают в C ++-версии приведенного выше кода.

Файл "filename", строка 106, в expand_minRect

self.minRect.size.height = self. minRect.size.height + value

AttributeError: у объекта 'tuple' нет атрибута 'size'

Я попробовал следующее. Я ожидал, что второе напечатанное значение (переменной width2) будет больше первого напечатанного значения (переменной width1) на value.

def expand_minRect(self, value):
    _,(width1, height1),_ = self.minRect
    print(width)
    self.minRect[1][0] = self.minRect[1][0] + value
    _,(width2,height2),_ = self.minRect
    print(w)

Однако это не сработало как тип переменной self.minRect[1][0] - кортеж, и кортежи нельзя изменить.

Файл "имя файла", строка 111, в файле расширения_минРект

self.minRect 1 [0] = self.minRect 1 [0] + значение

TypeError: объект 'tuple' не поддерживает назначение элементов

Я провел некоторое исследование, Я не смог найти документацию Python для RotatedRect, но нашел ответ stackoverflow о том, что

Python все еще не хватает класса RotatedRect

Итак, все в сторону, если допустить, что поддержка RotatedRect в Python3 неполная, как я могу обойти это и увеличить ширину и высоту моей переменной minRect?

1 Ответ

1 голос
/ 03 марта 2020

Согласно этого урока , minAreaRect возвращает прямоугольник с ((center_x,center_y),(width,height),angle). Таким образом, если вы измените ваш expand_minRect, чтобы воссоздать его с правильными компонентами, он должен работать.

def expand_minRect(self, value):
    self.minRect = (self.minRect[0],                                          # keep the center
                    (self.minRect[1][0] + value, self.minRect[1][1] + value), # update the size
                    self.minRect[2])                                          # keep the angle

Примечание. Проблема возникает из-за того, что OpenCV python имеет менее объектно-ориентированную реализацию, чем OpenCV c ++. Он не возвращает структуру, которая позволяет получить доступ к каждому атрибуту по имени (например, ".size"). Вам нужно знать порядок кортежей и предположения для каждого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...