对于find contour提取到的轮廓,怎么确保轮廓一定是密闭的,能给出对应的面积值输出,python代码
时间: 2024-05-15 19:18:24 浏览: 152
确保轮廓一定是密闭的方法是使用cv2.approxPolyDP()函数将轮廓近似为多边形,然后使用cv2.isContourConvex()函数判断多边形是否为凸多边形,如果不是则说明多边形内部有空洞,需要做进一步处理。输出对应面积值可以使用cv2.contourArea()函数,代码如下:
```python
import cv2
# 读取图像并转为灰度图
img = cv2.imread('contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 遍历每个轮廓
for i in range(len(contours)):
# 近似为多边形
epsilon = 0.01 * cv2.arcLength(contours[i], True)
approx = cv2.approxPolyDP(contours[i], epsilon, True)
# 判断是否为凸多边形
if not cv2.isContourConvex(approx):
# 去掉空洞
cv2.drawContours(thresh, [approx], 0, 0, -1)
# 计算面积
area = cv2.contourArea(approx)
print('Contour %d area: %.2f' % (i+1, area))
# 显示结果
cv2.imshow('image', img)
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
需要注意的是,如果轮廓内部有空洞,那么计算出来的面积将是空洞和轮廓的面积之和。为了得到轮廓的实际面积,需要先去掉空洞。
阅读全文