opencv-python常用函数解析及参数介绍(八)——轮廓与轮廓特征


前言

在前面的文章中我们已经学会了使用膨胀与腐蚀、使用梯度、使用边缘检测的方式获得图像的轮廓,那么在获得轮廓后我们可以对图像进行什么样的操作呢?本文将介绍轮廓的绘制与轮廓特征的使用以及轮廓近似的应用效果

1.获取轮廓

假设我们现在有这样一张名为feng.jpg的图片
在这里插入图片描述

同样为了表述方便,我们要先定义一个图像显示函数

def cv_show(img,name):
    cv2.imshow(name
### 使用 YOLOv8 和 OpenCV-Python 实现指针式仪表读数的自动化检测识别 #### 方法概述 为了实现指针式仪表读数的自动化检测识别,可以通过以下方式结合 YOLOv8 和 OpenCV-Python 完成任务。YOLOv8 是一种高效的实时目标检测框架,能够快速定位表盘及其关键部件(如零刻度线和结束刻度线)。OpenCV 则用于后续的图像处理操作,例如霍夫变换、边缘检测以及角度计算。 --- #### 数据准备阶段 在实际应用前,需构建一个高质量的数据集来训练 YOLOv8 模型。该数据集中应包含大量带有标注框的指针式仪表图片,标注内容至少包括表盘区域、零刻度线和结束刻度线的位置[^1]。 --- #### 训练 YOLOv8 模型 使用 Ultralytics 提供的官方工具链安装 YOLOv8 并训练模型: ```bash pip install ultralytics ``` 加载预定义配置文件并调整超参数以适应特定场景需求。以下是简单的训练脚本示例: ```python from ultralytics import YOLO # 加载预训练权重或自定义初始化 model = YOLO('yolov8n.pt') # 开始训练过程 results = model.train( data='path/to/your/data.yaml', # 数据集路径 epochs=100, # 迭代次数 batch=16 # 批量大小 ) ``` 通过上述代码可获得经过优化的目标检测器,专门用于检测指针式仪表的关键部分[^2]。 --- #### 图像预处理特征提取 当部署到生产环境时,先利用已训练好的 YOLOv8 对输入图像执行推理操作,获取感兴趣区域 (ROI),即表盘范围内的子图。随后借助 OpenCV 库进一步细化这些候选区间的细节特性。 ```python import cv2 import numpy as np def preprocess_image(image_path): image = cv2.imread(image_path) # 转灰度图以便减少颜色干扰 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 高斯模糊去除噪声 blurred = cv2.GaussianBlur(gray, (9, 9), 0) return blurred def detect_circles_and_lines(blurred_image): circles = cv2.HoughCircles( blurred_image, method=cv2.HOUGH_GRADIENT, dp=1.2, minDist=blurred_image.shape[0]/8, param1=50, param2=30, minRadius=10, maxRadius=100 ) edges = cv2.Canny(blurred_image, threshold1=50, threshold2=150) lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=50, minLineLength=50, maxLineGap=10) return circles, lines ``` 以上函数分别实现了基本的图像去噪和平滑化处理,同时还完成了轮廓搜索及直线段探测工作流程。 --- #### 数字解析逻辑设计 最后一步便是依据几何关系推导最终数值结果。假设我们已经成功找到了中心坐标 `(cx,cy)` 及半径 `r` 的弧轨迹;同时也捕捉到了指向当前测量值方向的一条射线起点终点分别为 `(px1,py1),(px2,py2)` 。那么就可以按照如下公式求解对应的角度θ: \[ \theta=\arctan \left( \frac{p_{y_2}-c_y}{p_{x_2}-c_x} \right)-\arctan \left(\frac{o_{y}-c_y}{o_{x}-c_x}\right ) \] 其中 \( o_x,o_y\) 表达的是起始参考位点座标位置信息。再乘上每单位角度代表的实际物理意义即可得出精确显示值。 --- #### PyQt 显示界面集成 为了让整个系统更加友好易用,在最后一环还可以加入图形用户接口(GUI)展示功能模块。这里推荐采用 Python 中流行的跨平台开发库——PyQt 来搭建简易窗口程序结构。 ```python from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PyQt5.QtGui import QPixmap class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() label = QLabel(self) pixmap = QPixmap('output_result.png') label.setPixmap(pixmap) self.resize(pixmap.width(), pixmap.height()) layout.addWidget(label) self.setLayout(layout) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 这样就能把处理后的成果直观呈现给使用者查看确认了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾醒(AiXing-w)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值