当前位置: 首页 > 知识库问答 >
问题:

FindContentours仅支持8uC1和32sC1映像

薛宇
2023-03-14

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

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

共有3个答案

伯彦君
2023-03-14

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

吴胜涝
2023-03-14

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

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

所以我必须显式地转换Float32-

thresh_image = thresh_image.astype(np.uint8)
杜俊逸
2023-03-14
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

 类似资料:
  • 我尝试使用图像处理技术,如直方图反投影和形态学滤波,但每当我试图在处理后的图像上找到轮廓时,它总是给我一个错误: 我试图找到多种方法将我处理过的图像转换成8uC1或32sC1,但都失败了。有人能告诉我如何将图像转换为8uC1或32sC1类型,以便在图像中找到轮廓吗? 代码:

  • 试图在二进制图像上运行findContour” thorws错误: 有什么想法吗?谢啦

  • 我想用haar cascade数数汽车。 我将图像正确地转换为灰度,并成功地在框架上画了一条线。问题是我得到了这个错误 错误:OpenCV(3.4.2)C:\build\3\u 4\u winpack-bindings-win32-vc14-static\OpenCV\modules\imgproc\src\contours。cpp:199:错误:(-210:不支持的格式或格式组合)[Start]

  • 我已经将我的图像文件转换为灰度,然后对其进行模糊处理并使用canny,结果是uint8,但我仍然得到了错误。请帮忙!

  • 在Java web应用程序的根目录中有以下两个servlet和一个index.html页面。html页面收集一些数据,使用Insert servlet插入数据,然后向用户提供一个URL来检索数据(即http://localhost:8080/12345)。我希望用户能够将http://localhost:8080/12345放在浏览器中,并调用Retrieve servlet。 现在发生的事情是,

  • 我试图在两个进程之间共享从USB摄像头(logitech c270)接收到的帧(图像),以便避免出现。我正在使用这里描述的内存映射流式I/O方法,在使用后,我可以成功地从相机获取帧。但是,我有另一个进程(用于图像处理),它必须在出列后使用图像缓冲区,并向第一个进程发出信号,再次对缓冲区进行排队。 在网上搜索,我可以发现打开视频设备多次是允许的,但是当我尝试映射(尝试两个和只是)在第二个过程后成功的