首页 > Python资料 博客日记
入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(上)
2024-09-27 11:00:06Python资料围观40次
目录
1.引言
在当今AI时代,关于视觉识别似乎已被深度学习所统治,而深度学习是个黑箱,无法看到里面运行的机制,并且它是一个疯狂的吞大数据的野兽,且运行需要极高的CPU或GPU的配置,对于初学者,尤其是手上没有高配置的机器的人,进入视觉识别设置了一道高高的门栏。
机器视觉作为人工智能领域的一个重要分支,正逐渐渗透到工业自动化、智能监控、医疗诊断、自动驾驶等众多领域。机器视觉技术赋予了机器“看”的能力,使得机器能够感知环境、理解图像内容,并做出相应的决策。
对于初学者来说,入门机器视觉可能会感到无从下手,市面上虽然有许多成熟的机器视觉软件,但它们往往价格昂贵,且功能复杂,不够灵活。幸运的是,Python语言以其简洁易懂的特性,结合OpenCV这一强大的计算机视觉库,为初学者提供了一个低成本、高效率的学习平台。
本文将引导读者通过编写一个简易的机器视觉调试工具,来深入理解机器视觉的基本概念和操作流程。我们将从零开始,一步步构建一个基于Python和OpenCV的应用程序,不仅能够帮助初学者快速入门,还能作为进一步探索机器视觉领域的知识储备。
效果如下:
2.框架思路
如上所示,我们可以把opencv这个极开源世界优秀视觉处理的知识库,从抽象的代码,变成一条条流程化的知识流,并且利用将超级参数的调整可视化,即视化实现对机器视觉处理模块或算法的快速直观理解,极端时间内建立对算法的“手感”。便于在实际问题中,快速思考获得解决方案。
视觉识别的过程就是一个图像信息的流处理过程:
基于以上思考,可以把我们的调试工具设计成一个类似流水线一样的解读执行过程,就是我们先根据场景特点确定上下游的处理模块,把它们做成一个草图,然后我们的主程序负责把它按流程图执行,并且可以随时打开流水线的某个处理盒子,对参数进行方便的调节。总得来说这个工具应该是这样的:
3.环境搭建
python的环境搭建是个头疼的过程,主要障碍是版本的选择,和网速。只要确定好这两者,那么也是一两行指令的事情。裸跑python的基本流程如下(有IDE工具跳过):
以上流程用到的指令有:
#windows
#更换成国内源
pip config set global index-url https://pypi.tuna.tsinghua.edu.cn/simple
#创建虚拟环境:
python -m venv myenv
#进入虚拟环境
myenv\Scripts\activate
#进入项目路径:
cd projectdir
#安装依赖:
pip install -r requirements.txt
#指令安装
sudo apt-get update
sudo apt-get install python3
#更换成国内源
pip config set global index-url https://pypi.tuna.tsinghua.edu.cn/simple
或者(pycharm的指令)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
#创建虚拟环境:
python3 -m venv myenv
#进入虚拟环境
source myenv/bin/activate
#进入项目路径:
cd projectdir
#安装依赖:
pip install -r requirements.txt
本项目用到的库:
matplotlib==3.8.4
networkx==2.6.3
numpy==1.22.4
opencv_python==4.7.0.68
pillow==10.3.0
PySimpleGUI==4.60.5
scikit_learn==1.5.0
4.图像处理流程化的实现
自然而然我们想到了一些优秀的数据结构可以实现我们的思路,比如xml、json。在python中我们就自然而然用到了字典这种格式:
{
"@img_source":["图像源1"],
"@folder":'./image',
"图像源1":{
"funname":"image_source",
"path":["./image/mask.png"],
"output":[],
"result":[],
"father":["root"],
"son":["颜色选择1","腐蚀操作1","固定阈值分割1","canny边缘1","颜色聚类1","图像旋转1"],
},
"图像旋转1":{
"funname":"imgrotaionTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":[],
},
"canny边缘1":{
"funname":"CannyThresholdTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":["形态学1"],
},
"颜色聚类1":{
"funname":"KmeansThresholdTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":[],
},
"形态学1":{
"funname":"morphologyTH",
"output":[],
"result":[],
"args":[],
"father":["canny边缘1"],
"son":["查找轮廓11"],
},
"查找轮廓11":{
"funname":"findContoursTH",
"output":[],
"result":[],
"args":[],
"father":["形态学1"],
"son":[]
},
"颜色选择1":{
"funname":"color_filterTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":["阈值分割111"],
},
"阈值分割111":{
"funname":"thresholdTH",
"output":[],
"result":[],
"args":[],
"father":["颜色选择1"],
"son":["形态学111"],
},
"形态学111":{
"funname":"morphologyTH",
"output":[],
"result":[],
"args":[],
"father":["阈值分割111"],
"son":["查找轮廓111"],
},
"查找轮廓111":{
"funname":"findContoursTH",
"output":[],
"result":[],
"args":[],
"father":["形态学111"],
"son":[]
},
"腐蚀操作1":{
"funname":"erodeTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":[]
},
"固定阈值分割1":{
"funname":"thresholdTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":["形态学11"]
},
"形态学11":{
"funname":"morphologyTH",
"output":[],
"result":[],
"args":[],
"father":["固定阈值分割1"],
"son":["查找轮廓1"],
},
"自适阈值分割1":{
"funname":"adaptiveThresholdTH",
"output":[],
"result":[],
"args":[],
"father":["图像源1"],
"son":[]
},
"查找轮廓1":{
"funname":"findContoursTH",
"output":[],
"result":[],
"args":[],
"father":["形态学11"],
"son":[]
},
}
如上通过这种简洁的数据格式,我们一口气把6条图像处理流水线給绘制了出来:
根据这样的思路,我们可以根据需要绘制无数条!!!
5.流水线上的算法块
一条流水线由一个一个处理块组成,处理块对于初学者来说无需自己从0开始编代码,opencv已经几乎集成了所有视觉处理算法块,并且是开源的,直接拿过来用就可以,而这块达到会使用的一个衡量指标是,对算法块参数的理解,难点也在这里。而理解算法块参数的最快方法不是去阅读计算机视觉原理,而是调试,就像想学会游泳最快的方法是跳进水里亲自感觉。后面如果再想深入,那么花时间去啃计算机视觉原理也不迟。
如上所示,一个查找颜色的模块,如果用opencv提供的算法块直接用代码形式去使用,那么要找到一中需要的颜色,在纯代码中,相信你会在确定模式、参数的设置中迷失,直至怀疑人生。但是如果将算法块中的参数暴露,并采用滑块进行随意调节,相信一个5岁的小孩也马上能掌握这个算法的参数调节和模式选择。
需要指出的是,在一个简单的机器视觉任务中,颜色查找这种古老的算法,仍然不失为一种性价比高的解决方案,还要什么AI、和GPU呢?
5.1 算法块的可视化
这里所谓的可视化,就是把算法模块套上一个GUI的皮囊,把参数暴露出来,供人们肆意玩弄。直到摸清它的脾气为止。这里我们用了简单办法,例如一个图像的旋转算法模块:
def imgrotaion(inputimg,center,angle,ratio=1,dsize=None,flags=None,borderMode=cv2.BORDER_REFLECT,borderValue=(0,0,0)):
"""
getRotationMatrix2D中:
center-旋转中心(x,y)
angle-旋转角度
ratio-缩放比例
warpAffine其中:
src - 输入图像。
M - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型!)
默认为 flags=cv2.INTER_LINEAR,表示线性插值,此外还有:cv2.INTER_NEAREST(最近邻插值) cv2.INTER_AREA (区域插值) cv2.INTER_CUBIC(三次样条插值) cv2.INTER_LANCZOS4(Lanczos插值)
borderMode - 边界像素模式(int 类型!)
borderValue - (重点!)边界填充值; 默认情况下,它为0.
"""
if len(inputimg.shape)==3:
if dsize==None:
h= inputimg.shape[0]
w= inputimg.shape[1]
dsize=(w,h)
if flags==None:
flags=cv2.INTER_LINEAR
M = cv2.getRotationMatrix2D(center, angle, ratio)
dst=cv2.warpAffine(inputimg,M,dsize,flags=flags,borderMode=borderMode,borderValue=borderValue)
return True,dst
else:
print("wrong image shape")
return False,inputimg
def imgrotaionTH(inputimg,mblock):
"""
图像旋转
"""
x=inputimg.shape[1]
y=inputimg.shape[0]
layout= [
[sg.Text('刷新率',size=(15, 1)),sg.Slider((1, 10),1 , 1, orientation='h', size=(10, 15), key='-speed-'),sg.Button('刷新')],
[sg.Button('Exit')],
[sg.Text('旋转角度:',size=(5, 1)),sg.Slider((1, 360),90, 1, orientation='h', size=(10, 15), key='-angle-')
],
[sg.Text('缩放比例:',size=(5, 1)),sg.Slider((0.1, 10),1, 0.1, orientation='h', size=(10, 15), key='-ratio-')],
[sg.Text('旋转中心:(x,y)',size=(5, 1)),
sg.InputText('('+str(int(x/2))+","+str(int(y/2))+")",key='-center-',size=(10, 1))],
[sg.Text('填充颜色',size=(15, 1)),
sg.InputText('(0,0,0)',key='-bordcolor-',size=(10, 1))],
[sg.Image(filename='', key='-IMAGE-')],
]
win = sg.Window('图像旋转TH', layout,resizable=True,disable_close=True)
def flash(win):
win_active=True
event=True
maxtime=1
tita=0
while win_active:
#...略
if event is None or event == 'Exit':
win.close()
win_active = False
break
flash(win)
如上,我们在imgrotaion函数块下面又建立了一个imgrotaionTH的GUI,并且把所有所需的参数显示出来,这样就完成了算法从抽象到形象。
6.总结
本上篇就到这里了,主要阐述了一些进入机器觉的法门,和一个我们认为比较实用的小工具的创建基本思想。
下篇接着唠…
7.调试工具成品链接
已经做了一个开箱即用的Windows的exe程序,供玩弄,本站资源:下载链接
-------------本篇完-------------
————————————————————————————————————————
PS.扩展阅读
————————————————————————————————————————
对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询
ps1.六自由度机器人相关文章资源
(1) 对六自由度机械臂的运动控制及python实现(附源码)
ps2.四轴机器相关文章资源
(1)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播
(2)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
ps3.移动小车相关文章资源
(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj