对象测量
弧长与面积
轮廓发现
多边形发现
approxPloyDP()
几何矩的计算
可以用来进行数字的边界查找,进行区域的划分
相关代码
import cv2 as cv
import numpy as np
def measure_object(image):
# 灰度化
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
# 显示阈值
print("threshold value : %s" % ret)
# 显示二值图像
cv.imshow("binary image", binary)
dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
# 查找轮廓
contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for i, contour in enumerate(contours):
# 求轮廓面积
area = cv.contourArea(contour)
x, y, w, h = cv.boundingRect(contour)
# 形状的长宽比
rate = min(w, h) / max(w, h)
print("rectangle rate : %s" % rate)
# 求取几何矩
mm = cv.moments(contour)
print(type(mm)) # 字典类型
# 获取中心位置
cx = mm['m10'] / mm['m00']
cy = mm['m01'] / mm['m00']
# 参数: 图像 圆心 半径 颜色 填充
cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
# 绘制外接矩形 参数:图像 起点 终点 颜色 线宽
cv.rectangle(dst, (x, y), (x+w, y+h), (0, 0, 255), 2)
print("contour area %s" % area)
# 多边形逼近 参数: 轮廓 epsilon close
approxCurve = cv.approxPolyDP(contour, 4, True)
print(approxCurve.shape)
# approxCurve.shape[0] 表示的是逼近的多边形的边数
if approxCurve.shape[0] > 6: # 多边形 可以看作圆形
cv.drawContours(dst, contours, i, (0, 255, 0), 2)
if approxCurve.shape[0] == 4: # 四边形
cv.drawContours(dst, contours, i, (0, 0, 255), 2)
if approxCurve.shape[0] == 3: # 三角形
cv.drawContours(dst, contours, i, (255, 0, 0), 2)
cv.imshow("measure-contours", dst)
src = cv.imread("image24.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
measure_object(src)
cv.waitKey(0)
cv.destroyAllWindows()
结果展示