《Opencv》基础操作详解(5)

news/2025/1/7 21:02:31/

接上篇:《Opencv》基础操作详解(4)-CSDN博客

目录

接上篇:《Opencv》基础操作详解(4)-CSDN博客

25、轮廓近似

简介

接口用法

参数说明

返回值

 代码示例

结果展示

26、轮廓最小外接圆

简介

接口用法

参数说明

返回值

画圆函数

参数说明

代码示例

结果展示

27、轮廓最小外接矩形

简介

接口用法

参数说明

返回值

画矩形函数

参数说明

代码示例

结果展示

28、模板匹配

 简介

接口用法

参数说明

返回值

处理返回值 cv2.minMaxLoc

参数说明

返回值

代码示例

结果展示 

总结


 

25、轮廓近似

简介

轮廓近似是指使用多边形来近似轮廓的形状。这个过程可以减少轮廓的顶点数量,从而简化轮廓的表示。OpenCV提供了cv2.approxPolyDP函数来实现这一功能。

接口用法

cv2.approxPolyDP(curve, epsilon, closed)
参数说明
  • curve: 输入的轮廓,通常是一个由点组成的数组。

  • epsilon: 近似精度。这是原始轮廓与近似轮廓之间的最大距离。较小的值会得到更精确的近似,而较大的值会得到更简化的近似。

  • closed: 一个布尔值,表示轮廓是否是闭合的。如果为 True,则函数会假设轮廓是闭合的。

返回值
  • 返回一个近似的轮廓,它是一个由点组成的数组。

 代码示例

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 函数来计算轮廓的外接圆。

接口用法

center, radius = cv2.minEnclosingCircle(points)
参数说明
  • points: 输入的轮廓点集,通常是一个由点组成的数组(例如轮廓的坐标点)。

返回值
  • center: 外接圆的圆心坐标,格式为 (x, y)

  • radius: 外接圆的半径。

画圆函数

cv2.circle(img, center, radius, color, thickness)
参数说明
  • img: 要绘制圆的图像。

  • center: 圆心坐标,格式为 (x, y)

  • radius: 圆的半径。

  • color: 圆的颜色,格式为 (B, G, R)

  • thickness: 圆的线宽。如果为负数(如 -1),则表示填充圆。

代码示例

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 函数来计算轮廓的最小外接矩形。

接口用法

rect = cv2.minAreaRect(points)
参数说明
  • points: 输入的轮廓点集,通常是一个由点组成的数组(例如轮廓的坐标点)。

返回值
  • rect: 一个旋转矩形,格式为 ((center_x, center_y), (width, height), angle)

    • (center_x, center_y): 矩形的中心点坐标。

    • (width, height): 矩形的宽度和高度。

    • angle: 矩形的旋转角度(以度为单位,范围是 [-90, 0])。

画矩形函数

cv2.rectangle(img, pt1, pt2, color, thickness)
参数说明
  • img: 要绘制矩形的图像。

  • pt1: 矩形的左上角坐标,格式为 (x, y)

  • pt2: 矩形的右下角坐标,格式为 (x, y)

  • color: 矩形的颜色,格式为 (B, G, R)

  • thickness: 矩形的线宽。如果为负数(如 -1),则表示填充矩形。

代码示例

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 函数来实现模板匹配。

模板匹配通过在输入图像上滑动模板图像,并计算每个位置的相似度(通过特定的匹配方法),找到与模板最相似的位置。

接口用法

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

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
参数说明
  • result: 输入数组(通常是匹配结果矩阵)。

返回值
  • min_val: 数组中的最小值。

  • max_val: 数组中的最大值。

  • min_loc: 最小值的位置,格式为 (x, y)

  • max_loc: 最大值的位置,格式为 (x, y)

代码示例

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 是一个非常强大的工具库,适合用于计算机视觉、图像处理和机器学习等领域。


http://www.ppmy.cn/news/1561371.html

相关文章

(MTK平台mt8168)通过i2c调试外接MCU管理外接电源项目

这个项目是我几年前在mtk方案公司调试的一个比较具有综合性的项目,涉及到知识点有很多,我个人认为算是一个很经典的一个项目,当然这个是对技术人员而讲。我大概总结一下,涉及到i2c,kernel中的timer_list,示波器和逻辑分析仪的使用,还有i2c硬件上的原理,如果host断采用3…

ESP32物联网无线方案,智能穿戴设备联网通信,产品无线交互应用

在物联网的世界里,每一个设备都不再是孤立的个体,它们通过无线连接芯片相互连接,形成一个庞大的智能网络。这些芯片是实现万物互联的基础,它们使得设备能够相互沟通,共享数据,从而创造出无限的可能性。 这…

【51单片机零基础-chapter5:模块化编程】

模块化编程 将以往main中泛型的代码,放在与main平级的c文件中,在h中引用. 简化main函数 将原来main中的delay抽出 然后将delay放入单独c文件,并单独开一个delay头文件,里面放置函数的声明,相当于收纳delay的c文件里面写的函数的接口. 注意,单个c文件所有用到的变量需要在该文…

RedisTemplate执行lua脚本及Lua 脚本语言详解

使用RedisTemplate执行lua脚本 在开发中,我们经常需要与Redis数据库进行交互,而Redis是一个基于内存的高性能键值存储数据库,它支持多种数据结构,并提供了丰富的命令接口。在某些情况下,我们可能需要执行一些复杂的逻…

形象地理解UE4中的数据结构 TLinkedListBase

大家都熟知链表,但不一定能快速看懂UE4中的数据结构。 TLinkedListBase表示“链接”中的一个结点,有三个成员: 一、ElementType Element; 表示具体的业务,例如int链条中的一个整数。 二、NextLink 表示 “下一个Node”&#…

【Blackbox Exporter】prober.Handler源码详细分析

http.HandleFunc(path.Join(*routePrefix, "/probe"), func(w http.ResponseWriter, r *http.Request) {sc.Lock()conf : sc.Csc.Unlock()prober.Handler(w, r, conf, logger, rh, *timeoutOffset, nil, moduleUnknownCounter, allowedLevel)})我们了解到blackbox_ex…

使用mysql报Communications link failure异常解决

背景 线上使用polarDB,基于mysql(5.7),架构为springbootmybatisplusdurid连接池,部分业务场景涉及大表更新和查询操作,在查询慢sql且超过一定时间时就会报出"Communications link failure"异常,主要体现在界…

基于人脸识别和 MySQL 的考勤管理系统实现

在现代企业和机构中,考勤管理系统是日常运营中不可或缺的一部分。传统的考勤方式(如打卡、指纹识别等)有时会因为各种原因导致管理效率低下或员工作弊。然而,随着人脸识别技术的飞速发展,基于人脸识别的考勤管理系统正…