cv2.findContours()行为奇怪吗?

时间:2018-11-14 08:31:36

标签: python opencv contour

我正在寻找图像中的轮廓。找到的每个轮廓,我都会打印出其边框和区域,然后将其绘制到图像上。有趣的是,我发现绘制了5个轮廓,而只打印了4个轮廓。有人知道这里发生了什么吗?

>>contour 1
>>(0, 0, 314, 326)
>>101538.5
>>contour 2
>>(75, 117, 60, 4)
>>172.0
>>contour 3
>>(216, 106, 3, 64)
>>124.0
>>contour 4
>>(62, 18, 138, 9)
>>383.5

enter image description here enter image description here

import cv2 
import numpy as np

img = cv2.imread('1.png')

imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)

_, contours, hier = cv2.findContours(thresh, cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE)

for i,c in enumerate(contours):
    rect = cv2.boundingRect(c)
    area = cv2.contourArea(c)
    print("contour " + str(i+1))
    print(rect)
    print(area)

cv2.drawContours(img, contours, -1, (0,255,0), 1)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:1)

;with tmp as ( select * from tableB where type = 'Type_A' ) select xa.*, s.idA from tableA s inner join tmp xa on s.idA = xa.idB 是您得到此消息的原因。它检索所有轮廓并创建完整的族层次列表。在轮廓检测中,您应该在黑色背景下使用白色物体。否则,由于层次结构列表的原因,您将立即获得结果。有关更多详细信息,请检查documentation

因此,请确保在黑色背景下找到白色物体的轮廓。添加cv2.RETR_TREE函数以转换图像。

。 。

cv2.bitwise_not()

。 。

输出:

  

imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.bitwise_not(imgray,imgray)