Ошибка OpenCV: утверждение не удалось ((scn == 3 || scn == 4) && (глубина == CV_8U || глубина == CV_32F)) в cvtColor - PullRequest
0 голосов
/ 26 октября 2018

Я получаю следующую ошибку:

enter image description here

Я провел исследование и обнаружил, что эта проблема вызвана несуществующим изображением, однако на этот раз это не так. Я проверил форму изображения с помощью np.shape, и он вернул значение. Вот мой код ниже

def process_with_webcam(self):
    ret, frame = self.vs.read()
    frame = frame[1]
    rospy.loginfo(frame.shape)
    if (frame is not None):
        contours = self.detect_balls(frame)

и вот где он ломается:

def detect_balls(self, frame):
    if frame is None:
        rospy.logerror("Empty frame")

        # resize the frame, blur it, and convert it to the HSV
        # color space
        frame = imutils.resize(frame, width=600)
        blurred = cv2.GaussianBlur(frame, (11, 11), 0)
        hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)

Любые предложения будут с благодарностью!

1 Ответ

0 голосов
/ 26 октября 2018

Виновником здесь является утверждение frame = frame[1], , потому что (выделено мной)

[Индексирование с помощью] Целое число i возвращает те же значения, что и i:i+1, за исключением того, что размерность возвращаемого объекта уменьшается на 1 . В частности, кортеж выбора с p-м элементом целым числом (и всеми другими записями :) возвращает соответствующий подмассив с измерением N - 1. Если N = 1, то возвращаемый объект является скалярным массивом.

Следовательно, вы превратили 3-мерное ndarray, представляющее 3-канальное изображение BGR, в 2-мерное ndarray. Благодаря тому, как работают привязки OpenCV в Python, двумерное ndarray обрабатывается как 1-канальное (в градациях серого) изображение.

Это легко продемонстрировать в интерпретаторе командной строки:

>>> import numpy as np
>>> a = np.arange(4*4*3, dtype=np.uint8).reshape(4,4,3)
>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]],

       [[24, 25, 26],
        [27, 28, 29],
        [30, 31, 32],
        [33, 34, 35]],

       [[36, 37, 38],
        [39, 40, 41],
        [42, 43, 44],
        [45, 46, 47]]], dtype=uint8)
>>> a.shape
(4, 4, 3)
>>> a[1]
array([[12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23]], dtype=uint8)
>>> a[1].shape
(4, 3)

Решение простое, вместо этого используйте frame = frame[1:2].

Продолжая вышеприведенную демонстрацию:

>>> a[1:2]
array([[[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]]], dtype=uint8)
>>> a[1:2].shape
(1, 4, 3)

Как отмечает Иван Поздеев в комментарии, есть и другие альтернативные обозначения. Имея это в виду, я бы, вероятно, выбрал

frame = frame[[1]]

, поскольку оно кратко и требует указания только нужного вам индекса.

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