FindContours仅支持8uC1和32sC1图像



我在火灾探测方面有问题我的代码是:

ret, frame = cap.read()
lab_image = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)
L , a , b = cv2.split(lab_image)
ret,thresh_L = cv2.threshold(L,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
ret,thresh_a = cv2.threshold(a,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
ret,thresh_b = cv2.threshold(b,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
thresh_image = cv2.merge((thresh_L, thresh_a, thresh_b))
dilation = cv2.dilate(thresh_image, None, iterations=2)
gray = cv2.cvtColor(thresh_image,cv2.COLOR_
(cnts, _) = cv2.findContours(dilation.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    if cv2.contourArea(c) < args["min_area"]:
        continue
    (x,y,w,h) = cv2.boundingRecy(c)
    cv2.rectangle(frame,(x,y),(x+w, y+h), (0,255,0), 2)
cv2.imshow('frame1',frame)

当我运行这个程序时,看到这个错误

FindContours support only 8uC1 and 32sC1 images in function cvStartFindContours

请帮帮我。tnx

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

在找到轮廓之前,使用图像上的这条线将其从BGR转换为灰度(8UC1)格式。FindContours函数仅支持灰度图像格式。

在我的解决方案中,我必须dtype转换为uint8

是的,我的图像是二进制图像(单通道),但在我的代码中,thresh_image不知何故被更改为float32数据类型。但cv2.findContours()不能处理float32

因此,我必须显式转换float32-->uint8

thresh_image = thresh_image.astype(np.uint8)

对于完成,8UC1格式为8字节、无符号、单通道。除了cv2灰度,单通道uint8格式也将有效,以防任何人在cv2函数之外构建图像并遇到此错误。

findContours的文档清楚地表明,它可以承受单通道图像作为输入(即8uc1和32sc1),但您发送的是3通道图像。以下是findcontour的文档http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours

我得到了这个错误并找到了原因:

我创建了: gray_img = np.zeros((width,height,3),np.uint8)

在gray_img中,深度=3,它与findContours不匹配。

然后我重新创建了: gray_img = np.zeros((width,height),np.uint8)

它奏效了。

相关内容

  • 没有找到相关文章

最新更新