入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(上)

目录

  • 1.引言
  • 2.框架思路
  • 3.环境搭建
  • 4.图像处理流程化的实现
  • 5.流水线上的算法块
    • 5.1 算法块的可视化
  • 6.总结
  • 7.调试工具成品链接
  • PS.扩展阅读
    • ps1.六自由度机器人相关文章资源
    • ps2.四轴机器相关文章资源
    • ps3.移动小车相关文章资源

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
#创建虚拟环境:
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_LINEARM = cv2.getRotationMatrix2D(center, angle, ratio)dst=cv2.warpAffine(inputimg,M,dsize,flags=flags,borderMode=borderMode,borderValue=borderValue)return True,dstelse: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=Trueevent=Truemaxtime=1tita=0while 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实现(附源码)
在这里插入图片描述

(2) N轴机械臂的MDH正向建模,及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及仿真环境资源:源码链接
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化:Seaborn

安装Seaborn 进入虚拟环境,在终端中键入 pip install seaborn 即可安装。 初步使用Seaborn 在使用seaborn之前,我们先了解一下seaborn是什么,seaborn是以matplotlib为底层的更简便的python第三方库,它可以更快捷地去设置图形的一…

关于el-date-picker组件,如何隐藏时间组件底部清空按钮

工作中可能会遇到el-date-picker组件隐藏时间组件底部清空按钮 分为两种 : 如果你想要实现全部的el-date-picker的清空隐藏 和 某一个页面的el-date-picker的清空隐藏 1 全局隐藏 步骤1:在element-ui.scss中添加如下代码: .el-picker-pane…

在VS Code中快速生成Vue模板的技巧

配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…

操作系统入门 -- CPU调度算法

操作系统入门 – CPU调度算法 在了解完进程和线程的概念后&#xff0c;我们就需要了解当一个进程就绪后系统会进行怎样的资源分配并运行进程&#xff0c;因此我们就需要了解CPU的调度算法 1.CPU调度 1.1概念 CPU调度即按照某种算法将CPU资源分配给某个就绪的进程。 1.2调度…

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(二)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)

前言 Matlab&#xff08;矩阵实验室&#xff09;是全球领先的数学计算软件开发商美国 MathWorks 公司研发的一款面向科学与工程计算的高级语言的商业数学软件&#xff0c;集算法开发、数据分析、可视化和数值计算于一体的编程环境&#xff0c;其核心是仿真交互式矩阵计算&…

买超声波清洗机什么牌子好?四大优越上品超声波清洗机总汇

随着生活品质提高&#xff0c;洗眼镜的方式是越来越多样化了&#xff01;传统的清洗眼镜方式非常容易导致眼镜损坏&#xff0c;从而缩短了眼镜原本的使用寿命&#xff01;因此超声波清洗机的出现就方便了大家&#xff0c;在清洗眼镜时&#xff0c;可以用超声波清洗机数分钟就搞…

基于WPF技术的换热站智能监控系统15--实时读取PLC数据

1、创建PLC实时数据 1、添加数据块 2、创建6个变量 用来表示水泵1和水泵2的参数&#xff0c;可以根据现场实际情况添加更多的变量参数 3、设置块属性并编译 4、下载该程序到PLC中 5、添加监控表 2、读取设备数据 S7协议下的tcp直接通讯&#xff0c;配置简单&#xff0c;一般P…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

10KM无人机高清图传通信模组,低延迟、抗干扰,飞睿智能无线MESH组网模块

随着科技的飞速发展&#xff0c;无人机技术在各个领域的应用越来越广泛。尤其在海上监测、搜索救援、货物运输等场景中&#xff0c;无人机的应用显得尤为重要。然而&#xff0c;要实现无人机在复杂海域环境中的高效通信&#xff0c;高清图传通信模组的作用不可忽视。本文将深入…

【笔记】复制Edge的网址粘贴后自动变成中文标题超链接

问题 1、从edge复制的网址粘贴直接显示网页内容名称而不是网址url。 2、复制任何网址粘贴到CSDN里面粘贴时直接转换成标题超链接&#xff08;很讨厌的功能习惯&#xff09;。 而如上两种问题不是互相影响的&#xff0c;就算设置了Edge的粘贴方式&#xff0c;复制到CSDN的文章…

来自红队大佬的经验之谈---命令执行过滤绕过-Windows篇

感谢来自老流氓大佬的投稿&#xff0c;本次文章介绍的是在windows环境下&#xff0c;过滤的“点”和“空格”等符号&#xff0c;导致在写入webshell时会受限。以下是针对该目标的绕过记录。 首先是命令执行和过滤验证&#xff0c;如下&#xff1a;​ 执行dir命令&#xff0c;…

基于JSP的二手车交易网站

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对二手车交易网站感兴趣或有相关开发需求&#xff0c;欢迎随时联系我。我的联系方式可以在文末找到。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#…

微服务开发与实战Day10 - Redis面试篇

一、Redis主从集群 1. 搭建主从集群 1.1 主从集群结构 单节点Redis的并发能力是有限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 如图所示&#xff0c;集群中有一个master节点、两个slave节点&#xff08;现在叫re…

机械师电脑文件丢失怎么办?6个恢复方法,希望能帮到您

机械师电脑作为高性能的计算机品牌&#xff0c;受到众多用户的青睐。然而&#xff0c;即便是品质卓越的电脑&#xff0c;也难免会遇到文件丢失的困扰。无论是由于误操作、系统故障还是硬盘损坏&#xff0c;文件丢失都可能给用户带来不小的麻烦。当您发现机械师电脑上的文件突然…

海洋经济捧出一个IPO,宁波海上鲜数字化赋能背后的喜与忧

近日&#xff0c;宁波海上鲜信息技术股份有限公司&#xff08;下称“海上鲜”&#xff09;向港交所递交上市申请&#xff0c;国泰君安国际、东兴证券&#xff08;香港&#xff09;为其联席保荐人。贝多财经获悉&#xff0c;该公司自2022年5月起便开始筹备赴港上市&#xff0c;但…

怎么把两个音频合成一个?将两个音频合成一个的四种方法

怎么把两个音频合成一个&#xff1f;在当今数字化的时代&#xff0c;音频处理已经成为我们生活中不可或缺的一部分。有时候&#xff0c;我们会希望将两段音频合成为一个&#xff0c;无论是为了制作音乐混音、创作声音效果&#xff0c;还是为了编辑播客节目或视频配音。合成音频…

怎么把网页上的接口信息导入postman

第一步 打开f12&#xff0c;右键选中需要的接口。选择copy-copy as cURL 第二步 打开postman&#xff0c;选择"Raw Text"&#xff0c; 把刚才复制的curl粘贴到空白位置&#xff0c;点击Continue - 最后的效果。导入的接口自带cookie&#xff0c;不用再输入cookie&a…

vulnhub靶机hacksudoLPE中Challenge-2

二、Challenge-2 1. ar Abusing 这个是要利用suid注意sudo也可以用&#xff0c;但是还是按照要求来 注意使用的suid自然是home文件夹 2. ash abusing 33. atobm Abusing 环境有问题&#xff0c;做不了 34. base32 Abusing 35. bash Abusing 36. cat Abusing 37. chmod Abusin…

警惕!ELSEVIER旗下1本双1区TOP被On Hold !请大家谨慎投稿

【SciencePub学术】又1本&#xff01;双1区TOP刊被On Hold &#xff01;官方现在对期刊质量的管控越来越严格了&#xff0c;被标记为On Hold后的期刊中&#xff0c;大部分的命运也是被WOS数据库剔除&#xff01;所以请大家谨慎投稿&#xff01; 《Information Sciences》作为一…