我一直收到以下错误:
我已经进行了研究,发现此问题是由不存在的图像引起的,但是这次不是这种情况。我使用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)
任何建议将不胜感激!
答案 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]]
因为它很简洁,并且只需要指定所需的索引即可。