Opencv contourArea函数记录直线轮廓面积
计算contour面积时候的一些问题记录,python语言实现
Opencv中findContours后,得到的contour可以使用contourArea函数计算其轮廓面积
值得注意的是,根据contourArea中的计算思路(貌似是向量乘法实现的:参考https://blog.csdn.net/m0_37914500/article/details/78615284)
根据此思路,直线,直线+点,以及多条直线的轮廓的面积比较特殊
直接看代码和结果记录一下:
import cv2
import numpy as np
img = np.zeros((90,90),dtype = np.uint8)
#直线面积
img_singleLine45 = img.copy()
cv2.line(img_singleLine45, (3,3), (70,70), 255)
_, contours_singleLine45, hierarchy_singleLine45 = cv2.findContours(img_singleLine45, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
area_singleLine45 = cv2.contourArea(contours_singleLine45[0])
print("area_singleLine45:", area_singleLine45)
img_singleLine135 = img.copy()
cv2.line(img_singleLine135, (3,70), (70,3), 255)
_, contours_singleLine135, hierarchy_singleLine135 = cv2.findContours(img_singleLine135, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
area_singleLine135 = cv2.contourArea(contours_singleLine135[0])
print("area_singleLine135:", area_singleLine135)
#多条直线面积
img_multiLines = img.copy()
for i in range(2):
one = 3+i
two = 70+i
cv2.line(img_multiLines, (3,one), (70,two), 255)
_, contours_multiLines, hierarchy_multiLines = cv2.findContours(img_multiLines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
area_multiLines = cv2.contourArea(contours_multiLines[0])
print('area_multiLines:', area_multiLines)
#直线加点面积
img_LineAndPoint = img.copy()
cv2.line(img_LineAndPoint, (3,3), (70,70), 255)
cv2.line(img_LineAndPoint, (3,4), (3,4), 255)
_, contours_LineAndPoint, hierarchy_LineAndPoint = cv2.findContours(img_LineAndPoint, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
area_LineAndPoint = cv2.contourArea(contours_LineAndPoint[0])
print('area_LineAndPoint', area_LineAndPoint)
cv2.imshow("Origin",img)
cv2.imshow("singleLine45",img_singleLine45)
cv2.imshow("singleLine135",img_singleLine135)
cv2.imshow("MultiLines",img_multiLines)
cv2.imshow("PointAndLine",img_LineAndPoint)
cv2.waitKey()
cv2.destroyAllWindows()
输出:
area_singleLine45: 0.0
area_singleLine135: 0.0
area_multiLines: 67.0
area_LineAndPoint 0.5
上述结果表明:
单条直线轮廓面积为0;
多条直线构成四边形,可正常计算面积;
直线加点应该是计算点和邻接线段构成的面积。