@[TOC](OpenCV入门(二十)快速学会OpenCV 19 目标丈量)
作者:Xiou
1.目标丈量
opencv 中目标丈量包括: 如面积,周长,质心,鸿沟框等。 弧长与面积丈量; 多边形拟合; 获取概括的多边形拟合成果。
python-opencv提供的办法:
cv2.moments() 用来核算图像中的中心矩(最高到三阶),
cv2.HuMoments() 用于由中心矩核算Hu矩,一起配合函数cv2.contourArea()函数核算概括面积,和cv2.arcLength()来核算概括或曲线长度
cv.approxPolyDP(多边形迫临) -contour -epsilon 越小越折 线越迫临真实形状 -close 是否为闭合区域
函数cv2.boundingRect回来四个参数(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高。 函数cv2.rectangle是制作矩形函数
函数cv2.minAreaRect回来的是一个 Box2D 结构, 其中包括 :矩形左上角角点的坐标(x,y),矩形的宽和高(w,h),以及旋转角度。 可是要制作这个矩形需求矩形的 4 个角点,可以通过函数 cv2.boxPoints() 取得,最后制作得到旋转鸿沟矩形。
函数cv2.minEnclosingCircle可以帮咱们找到一个目标的外切圆。它是一切能够彻底包括目标的圆中面积最小的一个。
函数cv2.fitEllipse回来值其实便是旋转鸿沟矩形的内切圆。
几许矩核算
一幅MN的数字图像(i,j),其p+q阶 几许矩mpq 和 中心矩 pq为:
2.多边形拟合
过程:
(1)读取图片; (2)转换成灰度图; (3)二值化; (4)概括检测; (5)核算概括周长; (6)多边形拟合;
格局:
cv2.approxPolyDP(curve, epsilon, closed, approxCurve=None)
参数:
curve: 输入概括; epsilon: 迫临曲率, 越小表示相似迫临越厉害; closed: 是否闭合。
代码实例:
import cv2
from matplotlib import pyplot as plt
# 读取图片
image = cv2.imread("logo.png")
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(image_gray, 127, 255, cv2.THRESH_OTSU)
# 核算概括
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 概括近似
perimeter = cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], perimeter * 0.1, True)
# 制作概括
result1 = cv2.drawContours(image.copy(), contours, 0, (0, 0, 255), 2)
result2 = cv2.drawContours(image.copy(), [approx], -1, (0, 0, 255), 2)
# 图片展现
f, ax = plt.subplots(1, 2, figsize=(12, 8))
# 子图
ax[0].imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB))
# 标题
ax[0].set_title("contour")
ax[1].set_title("approx")
plt.show()
输出成果:
3.核算目标中心
cv2.moments()可以帮助咱们得到轮距, 从而进一步核算图片目标的中心。
cv2.moments(array, binaryImage=None)
参数: array: 概括; binaryImage: 是否把 array 内的非零值都处理为 1, 默认为 None。
代码实例:
import numpy as np
import cv2
# 读取图片
image = cv2.imread("logo.png")
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(image_gray, 0, 255, cv2.THRESH_OTSU)
# 获取概括
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历每个概括
for i, contour in enumerate(contours):
# 面积
area = cv2.contourArea(contour)
# 外接矩形
x, y, w, h = cv2.boundingRect(contour)
# 获取论距
mm = cv2.moments(contour)
print(mm, type(mm)) # 调试输出 (字典类型)
# 获取中心
cx = mm["m10"] / mm["m00"]
cy = mm["m01"] / mm["m00"]
# 获取
cv2.circle(image, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 图片展现
cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图片
cv2.imwrite("result1.jpg", image)
输出成果: