首先,计算轮廓长度/周长和面积需要使用到OpenCV库中的cv2.contourArea()和cv2.arcLength()函数。在计算前需要先检测出轮廓。
以下是计算轮廓长度/周长和面积的详细攻略:
1. 导入库
import cv2
import numpy as np
2. 读取并预处理图像
image = cv2.imread('test.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
3. 边缘检测
edged_image = cv2.Canny(gray_image, 30, 200)
4. 寻找轮廓
contours, _ = cv2.findContours(edged_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
5. 循环计算所有轮廓的长度/周长和面积
for contour in contours:
perimeter = cv2.arcLength(contour, True)
area = cv2.contourArea(contour)
print("Perimeter: {:.2f}".format(perimeter))
print("Area: {:.2f}".format(area))
在上述代码中,边缘检测步骤使用了Canny算子进行边缘检测,轮廓检测使用了findContours函数,其中参数RETR_EXTERNAL表示只检测外部轮廓,CHAIN_APPROX_SIMPLE表示近似检测。
接下来是两个计算轮廓长度/周长和面积的示例:
示例1:计算单个轮廓的长度/周长和面积
image = cv2.imread('test.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged_image = cv2.Canny(gray_image, 30, 200)
contours, _ = cv2.findContours(edged_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
perimeter = cv2.arcLength(contours[0], True)
area = cv2.contourArea(contours[0])
print("Perimeter: {:.2f}".format(perimeter))
print("Area: {:.2f}".format(area))
在该示例中,首先读取与预处理图像,然后使用Canny算子进行边缘检测,使用findContours检测轮廓。
计算单个轮廓的长度/周长和面积时,只需使用第一个轮廓,使用cv2.arcLength()和cv2.contourArea()分别计算出轮廓的长度/周长和面积。
示例2:计算多个轮廓的长度/周长和面积并标注出来
image = cv2.imread('test.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged_image = cv2.Canny(gray_image, 30, 200)
contours, _ = cv2.findContours(edged_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算所有轮廓的长度/周长和面积
for i in range(len(contours)):
perimeter = cv2.arcLength(contours[i], True)
area = cv2.contourArea(contours[i])
print("Perimeter: {:.2f}".format(perimeter))
print("Area: {:.2f}".format(area))
# 将轮廓画在图像上
cv2.drawContours(image, [contours[i]], -1, (0, 0, 255), 2)
# 显示结果
cv2.imshow("Image", image)
cv2.waitKey(0)
在该示例中,同样先读取与预处理图像,然后使用Canny算子进行边缘检测,使用findContours检测轮廓。
对于多个轮廓的计算方法与示例1类似,不同之处在于需要使用循环计算每个轮廓的长度/周长和面积,并将其画在图像上。
最后,使用cv2.imshow()方法进行图像展示与cv2.waitKey()方法等待键盘输入。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenCV计算轮廓长度/周长和面积 - Python技术站