cv2.findContours无法检测轮廓

时间:2017-06-17 06:57:11

标签: python opencv image-processing vision opencv-contour

我有两个二进制图像,我正在尝试检测其中白色斑块的轮廓(拼贴右侧的粉红色轮廓是轮廓结果)。

cv2.contourFind()适用于Contour1:

Contour1 Image & Result

但是对于Contour2来说,它表现得很奇怪:

Contour2 Image & Result

这是函数调用

#Convert Image to grayscale
img = cv2.imread(file_name)
img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dilated = cv2.dilate(mask, kernel, iterations=2)
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for contour in contours:
    [x, y, w, h] = cv2.boundingRect(contour)
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2)

使用此contours变量,我会在找到的点周围绘制矩形。 我不明白为什么它适用于Contour1,但Contour2看起来非常相似时会失败。

1 个答案:

答案 0 :(得分:2)

错误:二进制图像在Contour2中有一个薄的白色边框,但在Contour1中没有(我的不好!)。由于我在

中仅要求 外部轮廓,cv2.RETR_EXTERNAL
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

对于Contour2只检测到最外面的框,因此没有绘制其子项。但在Contour1中,二进制图像周围没有白色边框,因此检测到内部白色斑点。

解决方案:使用cv2.RETR_LISTcv2.RETR_CCOMP