所以我看起来非常努力,但我找不到任何关于OpenCV错误的内容,绝对没有文档讨论可能的错误及其原因。我正在使用OpenCV2和Python 2.7,试图用网络摄像头跟踪彩色泡泡球。为了做到这一点,我通过将喷射球出现的HSV值周围的网络摄像头的最新图像设置为阈值来获得彩色球的中心。不幸的是,这似乎并不总是有效,并引发了一个非常神秘的错误:
cv2.error: .../matrix.cpp:235: error: (-215) step[dims-1] == (size_t)CV_ELEM_SIZE(flags) in function create
我不知道为什么会抛出这个。产生它的代码是:
def getColorCenter(self, imgHSV, lowerBound, upperBound, debugName = None):
detectedImg = cv2.inRange(imgHSV, lowerBound, upperBound)
if str(lowerBound) == str(self.GREEN_LOWER_BOUND):
cv2.imshow(str(lowerBound) + "puffball", detectedImg)
center = self.getCenterOfLargestBlob(detectedImg, debugName)
return center
,尤其是第detectedImg = cv2.inRange(imgHSV, lowerBound, upperBound)
行。
知道什么可以解决这个问题吗?
答案 0 :(得分:0)
如果网络摄像头未检测到任何斑点,则可能导致错误。
更好地解决问题的方法是使用轮廓。 您可以浏览图像中的所有轮廓并选择面积最大的轮廓。然后你可以返回最大轮廓的质心。
detectedImg = cv2.inRange(imgHSV, lowerBound, upperBound)
# If there is a lot of noise in your image it would help to open and dilate
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
detectedImg_open = cv2.morphologyEx(detectedImg, cv2.MORPH_OPEN, kernel)
detectedImg_dilate = cv2.dilate(detectedImg_open, kernel, iterations = 1)
现在找到轮廓:
_, contours, _ = cv2.findContours(detectedImg_dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
按区域查找最大的轮廓:
largest_contour_val = 0
largest_contour_pos = 0
for i in xrange(len(contours)):
if cv2.contourArea(contours[i])>largest_contour_val:
largest_contour_val = cv2.contourArea(contours[i])
largest_contour_pos = i
现在,只有存在至少一个轮廓时,才会返回最大轮廓的质心:
if len(contours)!=0:
# find centroid and return it
M = cv2.moments(contours[largest_contour_pos])
x = int(M['m10']/M['m00'])
y = int(M['m01']/M['m00'])
center = (x,y)
return center