我在寻找最大轮廓时遇到了一个问题。我使用的是canny边缘检测后的图像。
然后我使用
contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
来寻找轮廓。
下一步是找到最大的轮廓... 我试过了:
contour = max(contours, key = cv2.contourArea)
但这给我的是这样的结果:
有什么办法可以解决这个问题吗?谢谢!
码。
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。
显然,有些轮廓似乎不是封闭的。在这种情况下,使用长度而不是面积作为标准对我来说是有效的。
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 来解决这个问题。