Python中的OpenCV2抛出inRange错误



所以我非常努力地寻找,但是我找不到太多关于OpenCV错误的东西,而且绝对没有讨论可能的错误及其原因的文档。我正在使用Python 2.7的OpenCV2,试图用网络摄像头跟踪彩色泡芙球。为了做到这一点,我通过对网络摄像头中最新图像的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) .

你知道怎么解决这个问题吗?

如果摄像头没有检测到任何斑点,可能会导致错误。

解决这个问题的更好方法是使用轮廓。你可以遍历图像中的所有轮廓,然后选择面积最大的轮廓。然后可以返回最大轮廓的质心。

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

相关内容

  • 没有找到相关文章

最新更新