51 二值图像分析—使用轮廓逼近
代码
import cv2 as cv
import numpy as np
src = cv.imread("../images/contours.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
# 轮廓发现
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for c in range(len(contours)):
rect = cv.minAreaRect(contours[c])
cx, cy = rect[0]
result = cv.approxPolyDP(contours[c], 4, True)
vertexes = result.shape[0]
if vertexes == 3:
cv.putText(src, "triangle", (np.int32(cx), np.int32(cy)),
cv.FONT_HERSHEY_SIMPLEX, .7, (0, 0, 255), 2, 8);
if vertexes == 4:
cv.putText(src, "rectangle", (np.int32(cx), np.int32(cy)),
cv.FONT_HERSHEY_SIMPLEX, .7, (0, 0, 255), 2, 8);
if vertexes == 6:
cv.putText(src, "poly", (np.int32(cx), np.int32(cy)),
cv.FONT_HERSHEY_SIMPLEX, .7, (0, 0, 255), 2, 8);
if vertexes > 10:
cv.putText(src, "circle", (np.int32(cx), np.int32(cy)),
cv.FONT_HERSHEY_SIMPLEX, .7, (0, 0, 255), 2, 8);
print(vertexes)
# 显示
cv.imshow("contours_analysis", src)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
解释
对图像二值图像的每个轮廓,可以使用轮廓逼近,逼近每个轮廓的真实几何形状,从而通过轮廓逼近的输出结果判断一个对象是什么形状。OpenCV轮廓逼近的API如下:
approxCurve = cv.approxPolyDP(curve, epsilon, closed[, approxCurve])
其中
Curve
表示轮廓曲线epsilon
轮廓逼近的顶点距离真实轮廓曲线的最大距离,该值越小表示越逼近真实轮廓close
表示是否为闭合区域approxCurve
表示轮廓逼近输出的顶点数目
所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。