我想使用以下代码执行边缘检测。但是由于图像颜色深度,我得到一个错误。这个错误在我的眼中没有任何意义,因为我将图像正确地转换为灰度图像,并在随后的步骤中转换为黑白图像,这肯定是正确的。当我调用findContours时,我收到一个错误。
import cv2
def bw_scale(file_name, tresh_min, tresh_max):
image = cv2.imread(file_name)
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
#(thresh, im_bw) = cv2.threshold(image, tresh_min, tresh_max, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
(thresh, im_bw) = cv2.threshold(image, tresh_min, tresh_max, 0)
cv2.imwrite('bw_'+file_name, im_bw)
return (thresh, im_bw)
def edge_detect(file_name, tresh_min, tresh_max):
(thresh, im_bw) = bw_scale(file_name, tresh_min, tresh_max)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
if __name__ == '__main__':
edge_detect('test.jpg', 128, 255)
我收到此错误:
dgrat@linux-v3pk:~> python aoi.py
OpenCV Error: Unsupported format or combination of formats ([Start]FindContours support only 8uC1 and 32sC1 images) in cvStartFindContours, file /home/abuild/rpmbuild/BUILD/opencv-2.4.9/modules/imgproc/src/contours.cpp, line 196
Traceback (most recent call last):
File "aoi.py", line 25, in <module>
edge_detect('test.jpg', 128, 255)
File "aoi.py", line 19, in edge_detect
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.error: /home/abuild/rpmbuild/BUILD/opencv-2.4.9/modules/imgproc/src/contours.cpp:196: error: (-210) [Start]FindContours support only 8uC1 and 32sC1 images in function cvStartFindContours
答案 0 :(得分:6)
您的代码中存在的问题是您滥用\n
的返回值。
cv2.threshold返回2个参数:
<强> RETVAL 强>
当使用OTSU方法进行阈值处理(返回最佳阈值)时使用,否则它返回传递给函数的相同阈值,在您的情况下为128.0。
dst
是阈值结果图像
在您的代码cv2.threshold()
中,浮点数不是Mat。
变化:
thresh
到
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
下面使用以下测试图像找到原始代码的重构和简化版本。
contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
这会产生以下bw_test.jpg
在cnt_test.jpg中突出显示以下轮廓
答案 1 :(得分:3)
<强>更新强>
考虑到您已将图像转换为灰度,问题应该在于通道范围。 FindContours
仅支持32s
和8u
。您可以使用image.dtype
来确保获得uint8
之类的内容。如果不是cv2.convertScaleAbs(image)
should解决您的问题。
原始回答
由于错误提及FindContours support only 8uC1 and 32sC1 images
。因此,可能需要使用cv.CvtColor
之类的内容将图像转换为支持的色彩空间。
答案 2 :(得分:0)
在尝试使用灰度图像时,我遇到了相同的错误,然后我尝试将具有Canny边缘检测器的平均5X5块的高斯滤波器应用于cvtColor转换后的灰度图像。瞧!图片上的轮廓。
尝试此代码
image = cv2.imread('testimage.jpeg')
im_bw = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(im_bw, (5,5), 0)
im_bw = cv2.Canny(blur, 10, 90)
contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (0,255,0), 3)
plt.imshow(image)
plt.show()