接上篇:《Opencv》基础操作详解(4)-CSDN博客
目录
[处理返回值 cv2.minMaxLoc](#处理返回值 cv2.minMaxLoc)
25、轮廓近似
简介
轮廓近似是指使用多边形来近似轮廓的形状。这个过程可以减少轮廓的顶点数量,从而简化轮廓的表示。OpenCV提供了cv2.approxPolyDP函数来实现这一功能。
接口用法
python
cv2.approxPolyDP(curve, epsilon, closed)
参数说明
-
curve: 输入的轮廓,通常是一个由点组成的数组。
-
epsilon: 近似精度。这是原始轮廓与近似轮廓之间的最大距离。较小的值会得到更精确的近似,而较大的值会得到更简化的近似。
-
closed : 一个布尔值,表示轮廓是否是闭合的。如果为
True
,则函数会假设轮廓是闭合的。
返回值
- 返回一个近似的轮廓,它是一个由点组成的数组。
代码示例
python
import cv2
img = cv2.imread('./images/img_2.png')
# 转换灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
img_thresh = cv2.threshold(img_gray, 120, 255, cv2.THRESH_BINARY)[1]
# 寻找轮廓
contours = cv2.findContours(img_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]
area = [(cnt,cv2.contourArea(cnt)) for cnt in contours]
# area = []
# for i in contours:
# a = cv2.contourArea(i)
# area.append((i,a))
# 将轮廓进行排序,方便找出想要处理的轮廓
sorted_contours = sorted(area,key=lambda x: x[1],reverse=True)
aa = sorted_contours[1][0]
# 设置精度
epsilon = 0.005*cv2.arcLength(aa,True)
# 根据轮廓进行近似
approx = cv2.approxPolyDP(aa,epsilon,True)
print(approx.shape)
img_n = img.copy()
# 画出近似后的轮廓
image_contours = cv2.drawContours(img_n, [approx], contourIdx=-1, color=(0, 255, 0), thickness=2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)
结果展示
26、轮廓最小外接圆
简介
轮廓的外接圆是指能够完全包围轮廓的最小圆。OpenCV 提了
cv2.minEnclosingCircle
函数来计算轮廓的外接圆。
接口用法
python
center, radius = cv2.minEnclosingCircle(points)
参数说明
- points: 输入的轮廓点集,通常是一个由点组成的数组(例如轮廓的坐标点)。
返回值
-
center : 外接圆的圆心坐标,格式为
(x, y)
。 -
radius: 外接圆的半径。
画圆函数
python
cv2.circle(img, center, radius, color, thickness)
参数说明
-
img: 要绘制圆的图像。
-
center : 圆心坐标,格式为
(x, y)
。 -
radius: 圆的半径。
-
color : 圆的颜色,格式为
(B, G, R)
。 -
thickness : 圆的线宽。如果为负数(如
-1
),则表示填充圆。
代码示例
python
import cv2
img = cv2.imread('./images/img_2.png')
# 转换灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
img_thresh = cv2.threshold(img_gray, 120, 255, cv2.THRESH_BINARY)[1]
# 寻找轮廓
contours = cv2.findContours(img_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]
"""外接圆"""
img1 = img.copy()
(x,y),r = cv2.minEnclosingCircle(contours[247])
print((x,y),r)
img_cirle = cv2.circle(img1,(int(x),int(y)),int(r),color=(0,255,255),thickness=2)
cv2.imshow('cirle',img_cirle)
cv2.waitKey(0)
结果展示
27、轮廓最小外接矩形
简介
轮廓的最小外接矩形是指能够完全包围轮廓的最小面积的矩形。这个矩形可以是任意角度的(即不一定是轴对齐的)。OpenCV 提供了
cv2.minAreaRect
函数来计算轮廓的最小外接矩形。
接口用法
python
rect = cv2.minAreaRect(points)
参数说明
- points: 输入的轮廓点集,通常是一个由点组成的数组(例如轮廓的坐标点)。
返回值
-
rect : 一个旋转矩形,格式为
((center_x, center_y), (width, height), angle)
。-
(center_x, center_y)
: 矩形的中心点坐标。 -
(width, height)
: 矩形的宽度和高度。 -
angle
: 矩形的旋转角度(以度为单位,范围是[-90, 0]
)。
-
画矩形函数
python
cv2.rectangle(img, pt1, pt2, color, thickness)
参数说明
-
img: 要绘制矩形的图像。
-
pt1 : 矩形的左上角坐标,格式为
(x, y)
。 -
pt2 : 矩形的右下角坐标,格式为
(x, y)
。 -
color : 矩形的颜色,格式为
(B, G, R)
。 -
thickness : 矩形的线宽。如果为负数(如
-1
),则表示填充矩形。
代码示例
python
import cv2
img = cv2.imread('./images/img_2.png')
# 转换灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
img_thresh = cv2.threshold(img_gray, 120, 255, cv2.THRESH_BINARY)[1]
# 寻找轮廓
contours = cv2.findContours(img_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]
"""外接矩阵"""
img2 = img.copy()
# 找出矩形左上角位置以及宽和高
x,y,w,h = cv2.boundingRect(contours[247])
img_rectangle = cv2.rectangle(img2,(x,y),(x+w,y+h),color=(255,0,255),thickness=2)
cv2.imshow('rectangle',img_rectangle)
cv2.waitKey(0)
结果展示
28、模板匹配
简介
模板匹配(Template Matching)是图像处理中的一种技术,用于在图像中查找与给定模板图像最匹配的区域。OpenCV 提供了
cv2.matchTemplate
函数来实现模板匹配。模板匹配通过在输入图像上滑动模板图像,并计算每个位置的相似度(通过特定的匹配方法),找到与模板最相似的位置。
接口用法
python
result = cv2.matchTemplate(image, template, method)
参数说明
-
image: 输入图像(大图像)。
-
template: 模板图像(小图像)。
-
method: 匹配方法,常用的方法包括:
-
cv2.TM_SQDIFF
: 平方差匹配法。 -
cv2.TM_SQDIFF_NORMED
: 归一化平方差匹配法。 -
cv2.TM_CCORR
: 相关匹配法。 -
cv2.TM_CCORR_NORMED
: 归一化相关匹配法。 -
cv2.TM_CCOEFF
: 相关系数匹配法。 -
cv2.TM_CCOEFF_NORMED
: 归一化相关系数匹配法。
-
返回值
- result : 匹配结果矩阵,表示每个位置的匹配程度。矩阵的大小为
(W - w + 1, H - h + 1)
,其中(W, H)
是输入图像的大小,(w, h)
是模板图像的大小。
处理返回值 cv2.minMaxLoc
python
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
参数说明
- result: 输入数组(通常是匹配结果矩阵)。
返回值
-
min_val: 数组中的最小值。
-
max_val: 数组中的最大值。
-
min_loc : 最小值的位置,格式为
(x, y)
。 -
max_loc : 最大值的位置,格式为
(x, y)
。
代码示例
python
import cv2
kele = cv2.imread('./images/kele.png')
template = cv2.imread('./images/template.png')
cv2.imshow('kele',kele)
cv2.imshow('template',template)
cv2.waitKey(0)
# 获取图标的高和宽
h,w = template.shape[:2]
# 匹配
res = cv2.matchTemplate(kele,template,cv2.TM_CCOEFF_NORMED)
# 对匹配结果进行处理
# max_loc为左上角坐标
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
# 计算右下角坐标
bottom_right = (max_loc[0]+w,max_loc[1]+h)
# 根据左上角和右下角坐标绘制矩阵
kele_template = cv2.rectangle(kele,max_loc,bottom_right,color=(255,100,100),thickness=2)
cv2.imshow('kele_template',kele_template)
cv2.waitKey(0)
结果展示
总结
以上是 OpenCV 的基础操作总结,涵盖了图像处理的大部分常用功能。掌握这些操作后,你可以进一步学习更高级的图像处理技术,如特征检测、目标跟踪、深度学习等。OpenCV 是一个非常强大的工具库,适合用于计算机视觉、图像处理和机器学习等领域。