0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

福州市凌睿智捷电子有限公司 2024-12-14 09:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1 简介

Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。在深度学习中,我们会经常接触到两个名称,图像处理和计算机视觉,它们之间有什么区别呢?图像处理 (Image Processing)

目的:图像处理主要集中在改善或转换图像的质量,使得图像更适合人类观察或者为后续的分析做准备。

方法:通常涉及像素级别的操作,比如调整亮度、对比度、颜色校正、滤波(如高斯模糊、中值滤波去噪)、边缘检测、形态学变换(膨胀、腐蚀)等。

计算机视觉 (Computer Vision)

目的:计算机视觉的目标是使计算机能够理解和解释图像或视频的内容,实现类似于人类视觉系统的感知能力。

方法:使用高级算法来解析图像中的内容,包括但不限于特征提取、物体识别、分类、跟踪、场景重建等。这可能涉及到机器学习和深度学习模型的应用。

简而言之,图像处理是计算机视觉的基础,提供了必要的工具和技术来预处理和优化图像数据;而计算机视觉则是在此基础之上,通过更加复杂的算法和模型来解析图像的意义。在实际应用中,这两者往往是紧密结合的,共同作用于解决复杂的问题。例如,在一个自动驾驶系统中,图像处理可能会用于清理传感器输入的数据,而计算机视觉则负责识别道路上的行人、车辆和其他重要元素。

2 基础知识

OpenCV 是一个开源的计算机视觉和机器学习软件库,广泛用于图像处理、视频捕捉、物体检测等领域。一些常用操作及其目的:

读取图片

使用cv2.imread()函数加载图像。

目的:为后续处理和分析准备图像数据。

转换色彩空间

使用cv2.cvtColor()进行色彩空间转换。

目的:适应不同算法的需求,例如灰度图用于简化计算,HSV用于颜色分割等。

滤波

高斯模糊 (cv2.GaussianBlur)、均值滤波 (cv2.blur) 和双边滤波 (cv2.bilateralFilter) 等。

目的:降噪和平滑图像,或在保持边缘的同时模糊细节。

绘制图形

使用cv2.line()、cv2.rectangle()、cv2.circle()和cv2.polylines()来绘制直线、矩形、圆形或多边形。

目的:可视化结果,标注图像中的特征或者创建掩码。

边缘检测

Canny 边缘检测 (cv2.Canny) 或 Sobel 操作符 (cv2.Sobel)。

目的:检测图像中物体的边界,是很多高级计算机视觉任务的基础步骤。

阈值操作

cv2.threshold()用于二值化图像。

目的:突出显示感兴趣区域,简化图像以利于进一步分析。

Sobel 滤波

使用cv2.Sobel()计算图像梯度。

目的:增强边缘,通常与边缘检测相关联。

文件保存

cv2.imwrite()将图像保存到磁盘。

目的:保存处理后的图像以便将来使用或分享。

此外,还有其他重要的OpenCV功能,如:

直方图均衡化(cv2.equalizeHist) 提升图像对比度。

模板匹配(cv2.matchTemplate) 用于查找一个图像中的另一个小图像的位置。

特征点检测和描述子计算,如 SIFT, SURF, ORB 等,用于图像配准、拼接等任务。

这些基础操作和高级特性共同构成了强大的工具集,可以用来开发从简单的图像编辑应用到复杂的计算机视觉系统。 这些操作是构建复杂图像处理流水线的基础,可以单独使用,也可以组合起来解决更复杂的视觉问题。例如,预处理阶段可能会包括去噪、边缘检测和形态学操作;而在后处理阶段,则可能会涉及阈值操作和绘制几何图形来标注或解释结果。以上这些算子仅仅是OpenCV库的一小部分的内容,但是它们是支持我们进行复杂操作的基础。

3 实际操作

在学习OpenCV的初期,可能会觉得每个算子或函数就像是独立的知识点,虽然能够理解它们各自的功能和用法,但当面对实际问题时,却难以将这些知识点有效地组合起来解决问题。这是因为从理论到实践的应用需要一个过渡的过程,在这个过程中,不仅需要掌握单个算子的操作,还需要学会如何根据具体的需求选择合适的算子,并且合理地调整参数以达到预期的效果。OpenCV的强大之处在于它提供了丰富的图像处理功能,但这也意味着使用它的难点在于:

理解和记忆大量的算子:OpenCV库中包含了大量的算子,每个算子都有其特定的应用场景和参数设置。对于初学者来说,理解和记住这么多的内容可能是一个挑战。

算子之间的组合应用:很多情况下,单独使用一个算子并不能完成复杂的任务,而是需要多个算子相互配合。这就要求学习者不仅要了解各个算子的工作原理,还要懂得如何将它们有机地结合起来,以实现更复杂的功能。

参数调优:每个算子通常都带有一系列可调节的参数,这些参数的选择直接影响到最终的结果。找到一组最优化的参数值往往需要通过不断的实验和尝试,这既考验耐心也考验经验。

解决实际问题的能力:将理论知识应用于实践,解决真实世界中的问题是学习任何技术的关键。对于OpenCV而言,这意味着要能够分析给定的任务需求,确定所需的操作步骤,并正确地执行这些步骤。为了克服上述困难,建议多做练习,特别是针对不同类型的图像处理任务进行实战演练。同时,可以参考官方文档、在线教程以及社区讨论来加深对算子的理解,学习他人是如何解决问题的。此外,不断积累经验和案例研究也会有助于提高解决新问题的能力。

本文章主要讲述如何在边缘端设备上使用OpenCV。本次使用的边缘端设备是凌智电子开发的凌智视觉模块,具体如下:

4214312e-b9b8-11ef-8084-92fbcf53809c.png

如对该边缘端设备感兴趣,可到Gitee仓库:凌智视觉模块查看该设备的具体信息。

接下来我们通过几个例子来介绍如何在边缘端设备使用OpenCV进行形状检测。

3.1 矩形检测

importlockzhiner_vision_module.cv2ascv2fromlockzhiner_vision_module.editimportEditimporttimeimportsysif__name__ =="__main__": args = sys.argv iflen(args) !=3: print("Need model path. Example: python test_capture.py width height") exit(1) edit = Edit() edit.start_and_accept_connection() video_capture = cv2.VideoCapture() video_capture.set_width(int(args[1])) video_capture.set_height(int(args[2])) ifvideo_capture.open(0)isFalse: print("Failed to open capture") exit(1) whileTrue: read_index =0 total_time_ms =0 foriinrange(30): start_time = time.time() ret, mat = video_capture.read() ifretisFalse: continue end_time = time.time() # 转换为灰度图像 gray = cv2.cvtColor(mat, cv2.COLOR_BGR2GRAY) # 高斯模糊 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 _, binary = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV) edges = cv2.Canny(binary, 30, 200) contours, _ = cv2.findContours(edges.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: # 近似轮廓 # 计算轮廓周长 epsilon = 0.02 * cv2.arcLength(contour, True) # 将轮廓近似为多边形 if epsilon < 15:                    continue                approx = cv2.approxPolyDP(contour, epsilon, True)                # 如果近似轮廓有4个顶点,则认为是矩形                if len(approx) == 4:                    cv2.putText(mat, "Rectangle", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)                    cv2.drawContours(mat, [approx], -1, (0, 255, 0), 2)            edit.print(mat)            total_time_ms += end_time - start_time            read_index += 1        print(f"FPS is {1.0 / (total_time_ms / read_index)}")

在这一段代码中的检测效果如下图所示

42383592-b9b8-11ef-8084-92fbcf53809c.png

但是当我们只想要外部的矩形时,我们可以怎么做呢?

contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

426099a6-b9b8-11ef-8084-92fbcf53809c.png

效果如上图所示,接下来我们就得深究一下cv2.findContours mode 参数 和 method 参数的区别及作用了,我就不一一演示了,大家伙可以自行实验,毕竟我也踩过。mode: 轮廓检索模式,定义了如何检索轮廓及其层次结构。有以下几种选择:

cv2.RETR_EXTERNAL: 只检索最外层的轮廓。

cv2.RETR_LIST: 检索所有的轮廓,但不建立它们之间的等级关系。

cv2.RETR_CCOMP: 检索所有的轮廓,并将它们组织为两级层次结构:顶层是外部边界,次级是孔洞。

cv2.RETR_TREE: 检索所有轮廓,并重建完整的包含关系。

method: 轮廓近似方法,决定了轮廓的精度。有以下几种选择:

cv2.CHAIN_APPROX_NONE: 存储所有的轮廓点,即没有近似。

cv2.CHAIN_APPROX_SIMPLE: 压缩水平、垂直和对角方向上的元素,只保留端点。

cv2.CHAIN_APPROX_TC89_L1: 使用一种称为 Teh-Chin 链逼近算法的更复杂的压缩方式。

cv2.CHAIN_APPROX_TC89_KCOS: 同样使用 Teh-Chin 链逼近算法,但与 L1 不同,它是基于 KCOS 的。

3.2 圆形检测

OpenCV 提供了HoughCircles函数来检测圆形。Hough变换是一种用于从图像中提取几何形状(如直线、圆等)的技术,它通过参数空间的投票机制来实现。对于圆形检测,Hough变换可以识别出满足特定条件的圆形结构。下面是使用 OpenCV 进行圆形检测的基本步骤:

首先加载需要检测圆的图像,并将其转换为灰度图,因为颜色信息对于圆形检测不是必要的。调用cv2.HoughCircles函数进行圆形检测。该函数接受几个重要参数:

method:定义了检测方法,通常使用cv2.HOUGH_GRADIENT。

dp:累加器分辨率与图像分辨率的反比。dp=1 表示累加器具有与输入图像相同的分辨率。

minDist:检测到的圆心之间的最小距离。如果设置得太小,可能会检测到多个相邻的圆;如果太大,可能会漏检一些圆。

param1:Canny边缘检测的高阈值,低阈值是高阈值的一半。

param2:累加器阈值。该阈值越小,检测到的圆越多(包括不完美的圆)。越大则只检测到更明显的圆。

minRadius和maxRadius:分别为检测到的圆的最小和最大半径。

请注意,上述参数 (dp,minDist,param1,param2,minRadius,maxRadius) 需要根据具体应用场景调整,以获得最佳检测效果。例如,不同的光照条件、背景复杂度或者目标圆的大小都会影响这些参数的选择。实例代码

fromlockzhiner_vision_module.cv2importVideoCaptureimportlockzhiner_vision_module.cv2ascv2fromlockzhiner_vision_module.editimportEditimporttimeimportsyspi =3.14159265358979323846if__name__ =="__main__": args = sys.argv iflen(args) !=3: print("Need model path. Example: python test_capture.py width height") exit(1) edit = Edit() edit.start_and_accept_connection() video_capture = VideoCapture() video_capture.set_width(int(args[1])) video_capture.set_height(int(args[2])) ifvideo_capture.open(0)isFalse: print("Failed to open capture") exit(1) whileTrue: read_index =0 total_time_ms =0 foriinrange(30): start_time = time.time() ret, mat = video_capture.read() ifretisFalse: continue end_time = time.time() # 转换为灰度图像 # 转换为灰度图像 gray = cv2.cvtColor(mat, cv2.COLOR_BGR2GRAY) # 使用高斯模糊减少噪声 blurred = cv2.GaussianBlur(gray, (9, 9), 2) # 使用 HoughCircles 检测圆形 circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, dp=1, minDist=50, param1=50, param2=30, minRadius=120, maxRadius=250) # print(circles) if circles is not None: # 在图像上绘制检测到的圆 for i in circles[0]: center = (int(i[0]), int(i[1])) radius = int(i[2]) cv2.putText(mat, "circle", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) # 绘制圆心 cv2.circle(mat, center, 1, (0, 100, 100), 3) # 绘制圆 cv2.circle(mat, center, radius, (0, 255, 0), 3) edit.print(mat) total_time_ms += end_time - start_time read_index += 1 print(f"FPS is {1.0 / (total_time_ms/read_index)}")

检测效果图 :

42825686-b9b8-11ef-8084-92fbcf53809c.png


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    29

    文章

    1346

    浏览量

    59692
  • AI
    AI
    +关注

    关注

    91

    文章

    41059

    浏览量

    302561
  • OpenCV
    +关注

    关注

    33

    文章

    652

    浏览量

    45073
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【幸狐Omni3576边缘计算套件试用体验】YOLO26 板部署

    【幸狐Omni3576边缘计算套件试用体验】YOLO26 板部署 本文介绍了幸狐 Omni3576 开发板结合 OpenCV 和 Ultralytics 库实现 YOLO26 板
    发表于 04-19 22:02

    【幸狐Omni3576边缘计算套件试用体验】OpenClaw 板部署

    插件后,扫码绑定微信 微信弹出 ClawBot 对话框 总结 本文介绍了幸狐Omni3576边缘计算套件实现 OpenClaw 板部署,实现智能对话和终端控制的项目设计,包括环境搭建、OpenClaw
    发表于 04-19 20:56

    边缘AI算力临界点:深度解析176TOPS香橙派AI Station的产业价值

    在过去几年中,人工智能的基础设施部署重心正经历一场深刻的转移。如果说2020年的关键词是“大模型训练”,2023年的关键词是“推理下沉”,那么2025-2026年的关键词无疑是 “边缘原生
    发表于 03-10 14:19

    模型到产品:Qwen2.5-VL在BM1684X边缘计算部署全攻略

    前言:部署意义与应用场景1.1Qwen-2-5-VL与BM1684X的组合行业意义:•边缘AI革命:大模型从云端下沉到边缘
    的头像 发表于 01-13 14:17 5006次阅读
    从<b class='flag-5'>模型</b>到产品:Qwen2.5-VL在BM1684X<b class='flag-5'>边缘</b>计算<b class='flag-5'>部署</b>全攻略

    工业视觉网关:RK3576赋能多路检测与边缘AI

    ~150ms6TOPS NPU 边缘AI推理易对接 MES / 追溯系统 一、产线痛点:从“人看”到“机判”的转变· 多工位/多角度同步:单机位覆盖不足,典型项目需 8~12 路并发,且画面时序一致性要求高
    发表于 10-16 17:56

    何在基于Arm架构的边缘AI设备部署飞桨模型

    当 Arm 与领先的开源深度学习平台强强联合,会带来什么?那就是推动创新的“火箭燃料”。Arm 携手百度,利用双方在高能效计算平台与 AI 模型的技术积累,助力广大开发者加快边缘 AI
    的头像 发表于 09-06 14:07 1318次阅读

    部署边缘计算设备时需要考虑哪些问题?

    部署边缘计算设备时,需结合边缘计算 “ 靠近数据源头、低延迟、分布式、资源受限 ” 的核心特性,从硬件适配、软件架构、数据管理、网络稳定、可靠性保障等多维度综合考量,确保
    的头像 发表于 09-05 15:38 1426次阅读
    <b class='flag-5'>部署</b><b class='flag-5'>边缘</b>计算<b class='flag-5'>设备</b>时需要考虑哪些问题?

    ALINX VD100低功耗侧大模型部署方案,运行3B模型功耗仅5W?!

    模型能运行≠用户体验好。 IDC 预测,到 2026 年,全球超过 50% 的企业 AI 工作负载将部署边缘设备上。在
    的头像 发表于 09-03 14:58 873次阅读
    ALINX VD100低功耗<b class='flag-5'>端</b>侧大<b class='flag-5'>模型</b><b class='flag-5'>部署</b>方案,运行3B<b class='flag-5'>模型</b>功耗仅5W?!

    边缘智能网关在水务行业中的应用—龙兴物联

    、水库等关键设施进行视频监控(结合边缘AI)、门禁控制、环境监测(温湿度、有害气体)。 优势:‌ 本地智能分析:‌ 视频AI边缘完成入侵
    发表于 08-02 18:28

    为何边缘设备正成为AI的新重心

    人工智能 (AI) 正在以惊人的速度发展。企业不再仅仅是探索 AI,而是积极推动 AI 的规模化落地,从实验性应用转向实际部署。随着生成式模型
    的头像 发表于 07-30 09:12 996次阅读

    Arm方案 基于Arm架构的边缘设备(树莓派或 NVIDIA Jetson Nano)上部署PyTorch模型

    本文将为你展示如何在树莓派或 NVIDIA Jetson Nano 等基于 Arm 架构的边缘设备部署 PyTorch 模型
    的头像 发表于 07-28 11:50 3043次阅读

    边缘AI实现的核心环节:硬件选择和模型部署

    边缘AI的实现原理是将人工智能算法和模型部署到靠近数据源的边缘设备上,使这些
    的头像 发表于 06-19 12:19 1666次阅读
    <b class='flag-5'>边缘</b><b class='flag-5'>AI</b>实现的核心环节:硬件选择和<b class='flag-5'>模型</b><b class='flag-5'>部署</b>

    STM32F769是否可以部署边缘AI

    STM32F769是否可以部署边缘AI
    发表于 06-17 06:44

    边缘AI实现的核心环节:硬件选择和模型部署

    电子发烧友网综合报道 边缘AI的实现原理是将人工智能算法和模型部署到靠近数据源的边缘设备上,使这
    发表于 05-26 07:09 1576次阅读

    Deepseek海思SD3403边缘计算AI产品系统

    海思SD3403边缘计算AI框架,提供了一套开放式AI训练产品工具包,解决客户低成本AI系统,针对差异化AI 应用场景,自己采集样本数据,进
    发表于 04-28 11:05