我在火灾探测中遇到了问题 我的代码是:
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
答案 0 :(得分:9)
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
在想要找到等高线的Mat上使用此行,它应该可以使用,因为它会将图像转换为8UC1格式(灰度)。
答案 1 :(得分:7)
在我的解决方案中,我不得不将dtype
转换为uint8
。
是的,我的图像是二进制图像(单通道),但是在我的代码中,将thresh_image
更改为float32
数据类型。但是cv2.findContours()
无法处理float32
。
所以我不得不明确转换 float32
-> uint8
。
thresh_image = thresh_image.astype(np.uint8)
答案 2 :(得分:1)
为完成此操作,如果是8字节无符号单通道,则为8UC1
格式。
除cv2灰度外,单通道uint8
格式也将有效,以防任何人在cv2函数之外构建图像并遇到此错误。
答案 3 :(得分:0)
findContours
的文件明确表示它可以承担将单通道图像作为输入(即8uc1和32sc1)但你发送的是3通道图像。还有findcontours http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours的文档