Python OpenCV寻找最大的轮廓

问题描述 投票:0回答:1

我在寻找最大轮廓时遇到了一个问题。我使用的是canny边缘检测后的图像。Canny edge detection

然后我使用

contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

来寻找轮廓。

Contour detection

下一步是找到最大的轮廓... 我试过了:

contour = max(contours, key = cv2.contourArea)

但这给我的是这样的结果:

enter image description here

有什么办法可以解决这个问题吗?谢谢!

码。

import cv2
image = cv2.imread('TEST_1.png')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gaussian = cv2.GaussianBlur(gray,(3,3),cv2.BORDER_DEFAULT)
edges = cv2.Canny(gaussian,100,200)

contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contour = max(contours, key = cv2.contourArea)

contourImg = cv2.drawContours(image, contour, -1, (0,255,0), 3)
cv2.imshow("Contours", contourImg)

cv2.waitKey(0)
cv2.destroyAllWindows()

还有,这个点的等高线面积是109,我最大的等高线面积是3. 5。

python opencv opencv-contour
1个回答
0
投票

显然,有些轮廓似乎不是封闭的。在这种情况下,使用长度而不是面积作为标准对我来说是有效的。

import cv2
image = cv2.imread('TEST_1.png')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gaussian = cv2.GaussianBlur(gray,(3,3),cv2.BORDER_DEFAULT)
edges = cv2.Canny(gaussian,100,200)

contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
contour = max(contours, key = len)

contourImg = cv2.drawContours(image, contour, -1, (0,255,0), 3)
cv2.imshow("Contours", contourImg)

cv2.waitKey(0)
cv2.destroyAllWindows()

我还把 findContours 中的方法从 cv2.CHAIN_APPROX_SIMPLE 改为 cv2.CHAIN_APPROX_NONE.另外,你可以尝试通过改变 cv2.Canny() 中的极限值和使用 cv2.RETR_EXTERNAL 来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.