OpenCV错误:在cvtColor中断言失败((scn == 3 || scn == 4)&&(深度== CV_8U ||深度== CV_32F))

时间:2018-10-26 06:57:28

标签: python numpy opencv

我一直收到以下错误:

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 :(得分:1)

罪魁祸首是frame = frame[1]because(强调我的意思)

  

[索引]整数 i 返回与i:i+1相同的值,除了返回的对象的维数减少1 。特别是,第p个元素为整数(以及所有其他条目:)的选择元组将返回尺寸为N-1的相应子数组。如果N = 1,则返回的对象是数组标量。

因此,您已将表示3通道BGR图像的3维ndarray转换为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)

正如Ivan Pozdeev在评论中提到的那样,还有其他替代符号。考虑到这一点,我可能会选择

frame = frame[[1]]

因为它很简洁,并且只需要指定所需的索引即可。