如何在低通滤波后的图像上找到轮廓?

时间:2019-05-22 17:21:39

标签: opencv computer-vision convolution opencv-contour lowpass-filter

我是计算机视觉的新手。因此,我不知道以下代码的内部实现,因此无法调试该错误。任何人都可以在以下代码中指出错误吗?

代码使用Box Filter和Edge detection Kernel矩阵的组合将停车图像转换为二进制图像。然后我试图找到轮廓。 现在我知道可以在二进制图像上找到轮廓,可以使用cv2.threshold()函数导出轮廓,从Filter和Kernel矩阵获得的图像是否也是二进制图像?

import cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread('parking spot1.jpg',1)
k3 = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))
low_filter = cv2.boxFilter(img, -1, (4,4))
output_low = cv2.filter2D(low_filter, -1, k3)
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')

plt.subplot(2, 2, 2)
plt.imshow(output_low)
plt.title('matrix1')

plt.show()

img, ret, heirarchy = cv2.findContours(output_low, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

您认为我做错了什么? 对于这个问题的解释或指导,我将不胜感激。

非常感谢。

我面临的错误是:


  

回溯(最近通话最近)    在()中   ----> 1 img,ret,hierarchy = cv2.findContours(output_low,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

     

错误:OpenCV(3.4.3)/io/opencv/modules/imgproc/src/contours.cpp:199:错误:(-210:不支持的格式或格式组合)[开始]当以下情况下,FindContours仅支持CV_8UC1图像:模式!= CV_RETR_FLOODFILL否则仅在函数'cvStartFindContours_Impl

中支持CV_32SC1图像

1 个答案:

答案 0 :(得分:1)

请正确阅读documentation of filtering。明确指出,输出与源具有相同的大小和类型。因此,您的output_low是三维的,cv2.findContours无法应用在其上。您可以按照说明使用阈值,也可以使用以下命令将output_low转换为Graysacale:

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

然后找到轮廓。