转几篇知乎上一位研究视觉方面博士的一些经验贴子

偶然看到知乎上一位研究机器视觉博士的贴子,都是些经验之谈,蛮好看的。

就转过来,大家一起经验一下吧。


opencv怎么学

作者:wqiasky
链接:https://zhuanlan.zhihu.com/p/37823735
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

学习图像处理,掌握一种工具非常重要,这工具是指图像处理库函数。虽然有不少图像函数库,比如halcon、visionpro、matlab、labview等。我个人建议采用opencv比较好。opencv使用比较灵活,里面的很多函数都可以找到源代码,知道其实现过程。而其他的很多图像库你只是被动的调用其函数,不知道内部过程。这样自己自由发挥的空间有限。虽然做视觉项目的时候,很多时候是直接调用现有的函数库。但是,并不是只调用这些函数就能够完成一个项目,通常,在调用这些函数得到一些结果后,自己还要在这些结果上做一些处理,才能够最终得到想要的结果。比如,做边缘检测,但是检测完之后呢?最终是要输出结果的,这个结果可能是圆心的位置、可能是得到某些直线,也可能是根据边界得到某种形状。又比如,通过做图像匹配来寻找某个特定的对象,这是你要想办法消除光照的影响,又要想办法消除模板图像与匹配图像大小不一致的问题,就可能用到多尺度。如果要消除光照不一样的影响,可能要就行差分计算,或者进行差分编码对图像进行变换,而这些操作在opencv里面可以很方便的实现,但是这些操作可能在所有的图像库里面并没有对应的函数,因为这些操作不能归为标准的图像处理算法。而采用其他工具实现起来相对比较麻烦。

对于opencv怎么学,对于完全没有学过程序语言的人来说,可能要先花一些时间去学习C语言或c++。这个基础也不需要太多,能看懂简单的代码应该就可以。刚开始接触opencv的时候,很多人是一头雾水,不知道从何下手。其实,opencv就是在操作二维图像矩阵。从opencv2.0开始,图像数据采用Mat格式存储,Mat里面就是一堆二维数据。所有,我们学习opencv,可以从操作Mat矩阵开始。这个阶段要达到什么程度呢?就是要让自己可以任意操作Mat数组。比如,做算术运算加减乘除,差分绝对值,位运算,均值,偏差,特征值,特征向量,求和,协方差矩阵,翻转,逆矩阵,转置,对数运算,指数运算,幂运算,取子矩阵等等,要熟练掌握这些操作,这样,你遇到图像数据时,如果你想从矩阵中取出自己想要的内容,将会得心应手,而不会不知所措。这些操作刚开始可能需要背下来,以后慢慢用熟练了,自然就会了。比如,我们要做图像匹配,在实际应用中,一般不会将整幅图与模板进行匹配,因为匹配的速度太慢,从图像上观察,要匹配的区域总是在某一个固定的范围内,这时,我们就去图像的子矩阵,将这一部分区域取出来,然后再与模板进行匹配,这样可以在很大程度上提高速度,实际中,为了保证目标在图像内,采集的图像总是较大,而感兴趣的区域总是较小。此外,匹配的时候,不一定是利用opencv自带的方法进行匹配,你可以自己算一些特征值进行匹配,比如算梯度、均值、偏差等,利用这些值进行匹配。而这些操作都是基本的Mat操作。有了这个基础,就可以开始看一些图像处理函数了。当然,根据每个人的基础不一样,学习方法也是灵活多变的。


一点感触

作者:wqiasky
链接:https://zhuanlan.zhihu.com/p/37733015
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

从刚开始读研究生,到博士毕业,时间一晃就十多年就过去了,零几年上研究生开始搞图像处理,从最初的什么都不懂开始做起,而opencv2000年发布第一个版本,2009年发布OpenCV 1.2,那时写图像处理程序都是自己写代码去解读各种格式的图像文件,国内专门搞图像处理的人还很少。资料也少得可怜。可惜,opencv发展到现在,已经推出了好多个版本,halcon也潜心做了很多年,康耐视也做了好多年,而我们国内缺少匠心精神,总是想急于求成,结果反而没有做好,现在回想起来,当初大家也想过做图像库,那时opencv,halcon等还没有什么名气。或者说整个图像处理行业在国内没有什么市场,因为图像处理的数据量比较大,而那是的电脑处理起来也比较费劲。更别说在线实时处理了,基本上都是做成单机版的图像处理软件。说起来,我们与opencv基本上处于同一起跑线,可是,由于种种原因,我们没有做成图像库,而opencv做成了,想起来还是有些遗憾。现在,准备从基本的图像处理知识开始,从头开始把图像处理的内容分享给一些想做图像处理而不知道怎么开始做的人。网上很多人一提到学习图像处理,就说看冈萨雷斯的数字图像处理这本书,可是这本书那么厚,没有耐心基本上是看不完的,很多人看到一部分就放弃了。其实,现在opencv库已经做的很好了,从应用的角度来学习图像处理的话,没有太多必要去看那本书,如果纯粹为了搞研究写点论文的话,可以去看看那本书,但是帮助也不是很大。基本的理论了解下就可以了,要创新算法写论文的话,还是要关注国际顶级会议以及顶级图像处理期刊上的文章。国内的文章没有什么实质性的内容,没有太多必要去看,如果为了以后的应用,把opencv学好就够了。尽量不要在matlab上做应用,毕竟不是很方便。而且,即使用opencv,也建议不要用MFC,学习opencv采用控制台程序就行,实际应用最好用c#,MFC做界面可能就会让你崩溃,如果程序水平不高,内存问题就会让你疲于奔命。就算用c++结合QT做界面,其效率与c#相比,也没有什么优势,毕竟QT的信号槽机制会影响效率。而且,c++和QT之间来回的调用截面,也不是很方便。c#版本的opencv是emgucv,已经把opencv封装的比较好了,即使不封装,自己采用c++封装opencv的函数,然后用c#调用c++的dll文件也是很方便的。企业对项目实施的进度要求是非常紧的,采用c#可以专注于实现功能,而不需要花费太多时间去做界面,这是非常有利的。想当初,在MFC下自己写图像处理函数,然后自己做界面,菜单,工具条,做交互式操作,做绘图的坐标变换,做一档多视,在一个界面上显示无数的缩略图,慢慢的计算鼠标双击的坐标位置,等等等等,半夜还在查看哪里内存泄漏,现在想起来都是泪,可是当时没有什么方便的工具。现在不同了,已经可以很方便的在c#上实现了,当然,如果你对QT很熟悉,采用c++结合QT的方式也是不错的选择。如果不是很熟,那又要花不少时间去熟悉QT,而熟悉QT相比C#可能要更加费时间一些。如果你对c++比较熟悉的话,直接转向c#基本上不需要花费太多的时间,可以直接上手。


关于人工智能

作者:wqiasky
链接:https://zhuanlan.zhihu.com/p/37689393
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

google的AlphaGo让人工智能一下子火了起来。其实人工智能已经提出了很多年了,机器学习也已经提出了好多年了,深度学习也是机器学习的一种。靠着深度学习,一下子将人工智能技术提高了很多。可是,很多人并不了解人工智能到底是什么,能做什么。如果我们想学习人工智能,又应该怎么学习呢?要学些什么东西呢?学了之后又有什么用处呢?

人工智能是一个综合性的学科,而且,这个概念也不是最近几年才提出来的,已经提出了很多年了。简单得说,人工智能就是让机器像人一样思考,具有像人一样的智慧。伟大的科学家图灵在很多年前对这个问题进行了思考,并且提出了图灵测试。现在有很多地方已经应用了人工智能技术。人工智能包括了很多方面的知识。比如计算机视觉、自动控制、语音识别等。任何一个人想要完成整个人工智能系统都是不大可能的。人工智能的关键在于机器的自主学习过程,这个需要大数据作为支撑。因此,对于很多应用反而又受到限制。

目前人工智能技术还不能完全应用在企业中,技术上还远没有达到,只能够实现部分智能化操作。要完全实现人工智能的应用还有很长的路要走。深度学习让人工智能一下子火了起来,因此,一下子冒出了很多人搞深度学习。其实,对于大部分人来说,没有必要去研究深度学习,因为对于很多具体的行业,没有大数据进行分析,深度学习是没有什么效果的。因为你不可能像李菲菲那样整一个image.net数据库。你也不可能像马云那样每天可以收集大量的用户购买信息,也不可能进入公安监控系统去采集大量的街上行人的图像。如果是搞研究,这个方向应该能研究下去,至少写几篇论文没有什么问题。

对于很多应用而言,可能只用到了很少一部分智能化的东西。而且也是很弱智的智能化,或者根本就没有智能,只是自动化。比如自动化的机械手臂实现自动抓取,智能仓储里面也没有太多智能化的东西,无非就是自动识别、定位、抓取、运输、轨迹规划之类。这里面没有机器学习过程,只能算最简单的人工智能。但是,我们的大多数企业需要的恰恰就是这种应用,因此,我们大部分人没有必要去研究深度学习,你要学习人工智能,只需要学好其中的某一个方面就行了。比如,搞视觉的,你把图像处理学好就行了,搞控制的,你把自动化控制整好就行了。因此,现在提到的人工智能,更多的其实是自动化,没有太多的智能在里面。但是,这个自动化已经会让很多人失业了。从长远来看,人工智能肯定会代替很多目前人类的工作,可能就在我们这代人就会看到,人工智能包括的学科实在太多,数学,神经生理学,心理学,计算机科学,信息论,控制论,不定性论,仿生学等学科。其中,计算机视觉可以认为是大部分人工智能技术的核心。人类约80%的信息是靠视觉接受,要让机器代替人,也少不了让视觉来接受信息,让计算机来处理信息,这部分就属于计算机视觉,计算机视觉的核心就是图像处理,学习这方面的内容将会是一个不错的选择。


闲来无事,谈谈计算机视觉 ——硬件选择

作者:wqiasky
链接:https://zhuanlan.zhihu.com/p/37641714
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对于做计算机视觉的人来说,了解相关的硬件选择是必不可少的。计算机视觉的硬件选型主要有光源、相机和镜头,其他的一些辅助硬件就没有必要耗时间专门去学习了。下面主要谈谈光源、相机和镜头的选择

对于光源的选择,计算机视觉的光源有很多种。比如普通的白炽灯也可以作为光源,但是效果不好。还有一些激光光源,但是价格昂贵。目前主流的是选择LED光源。LED光源使用时间长,发光稳定,而且,发光速度快,价格也不是很贵。因此,选择LED光源是主流。而且,通常选择的是进口的LED光源。说实在话,国内的很多光源确实没有进口光源好。光源的选择主要从是否能够凸显物体的特征方面进行考虑。这个要看检测对象需要突出什么特征。而且,要考虑物体表面的颜色因为不同的颜色对光的吸收是不一样的,这样就要考虑光源的颜色,LED光源的颜色基本上各种颜色的都有,这点不需要担心。此外,还要考虑光照的角度,不同的角度采集出来的图像有很大区别。很久以前有一次遇到个项目,当时因为主要专注于图像处理算法,对硬件完全没有去了解,不懂光源照射角度,主观以为都是垂直照射效果最好,结果很长时间采集出来的图像都达不到处理的要求。后来咨询了专门卖相机光源的公司,他们帮我们采集的图像效果完全不一样,才开始接触光源的选择以及照射角度问题。慢慢了解光源选择的重要性。LED光源有不同的形状,常见的是环形光源,还有条形光源,同轴光源、穹顶光源等,每种形状的光源应用在不同的地方。而且可以根据需求定制形状,比较自由,当然定制的光源价格要贵一些。光源的照射方式根据图像处理的要求来确定,比如,如果要检测零件的表面尺寸,一般采用背光照明,这样采集的图像轮廓比较明显。理解光源的选择对了解项目实施是否成功具有关键作用,因为好的图像质量才可能成功实施视觉项目,曾经遇到一个项目,因为硬件部分是别人选择的,结果图像质量很差,让我们做图像算法的人费尽了脑筋,结果效果也不是很好。所以,真正在做视觉项目的时候,一定要多试几种光源,最好找卖光源相机的公司帮忙采图,因为他们的光源比较多,可以多个光源比较图像采集的效果。

工业相机与普通的相机是不同的,其稳定性和抗噪声能力要好很多。工业相机按照扫描方式分为面阵相机和线阵相机。可能人们一般知道的相机就是按一下快门照一张图像,工业相机是不一样的。因为采集图像的过程是需要控制的,不是随时都要采集图像,只在需要的时候采集图像,这时候一般要加一个触发传感器。面阵相机采图是一次采一张图像,而线阵相机每次是采集一条线的图像,线阵相机一般是在运动的平台上采图,而且,最好是相机不要动,让采集对象的平台运动,这样可以保证相机采集的图像质量稳定,线阵相机最麻烦的是要求采集的速度与运动平台的速度一致,不然采集的图像会变形。一般人不了解,其实工业上线阵相机应用很多。因为,面阵相机的采集范围有限,而线阵相机的采集范围可以无限长。选择相机主要关注相机的分辨率,采集速度(即最大帧率或行频),曝光时间,景深等方面的参数。此外,还有采集的图像的像素深度和像素尺寸,像素深度关系到图像的格式,这一点在后面专门介绍数字图像。而像素尺寸关系到图像处理的精度。相机芯片的尺寸也需要了解一下,芯片尺寸是用英寸来表示的,但是这个英寸与长度单位的英寸是有区别的,比如1/2’的芯片。芯片是一个长方形,对角线与长宽的比例是5:4:3,按照1’=对角线16mm来计算的,所以1/2’的芯片的长宽就是:

16*(1/2)*(4/5)=6.4mm,16*(1/2)*(3/5)=4.8mm。

其他的芯片大小都按照这种方式进行计算。

镜头对于很多不了解计算机视觉的人来说,可能完全没有概念。因为我们平时用手机照相的时候,相机和镜头是一起的,觉得相机就有镜头,其实,工业相机和镜头是分开的两个硬件。镜头主要用于相机的进光,如果没有镜头,相机得到的图像将是白茫茫一片,什么也看不出来。相机和镜头之间有接口,而且这种接口有好几种,如果选择错了相机和镜头,可能导致两者无法连接,当然更加不能采集图像了。镜头主要关注的参数首先当然是焦距了,此外,还有光圈,镜头的分辨率等。焦距与以前物理光学中学的焦距是一样的,这里就不再解释。光圈主要是控制镜头进光量的多少,在镜头上有个“F”,就表示光圈,光圈是可以调整的,其实光源就是从来将镜头挡住一部分,因为镜头的大小不能调,只能采用一个办法调整进光量,就是将镜头的一部分遮住。遮住部分的多少就是靠调整光圈的大小。此外,镜头的分辨率也是一个重要的参数。这里很多人觉得镜头的分辨率和相机的分辨率是一样的额,其实这是两个不同的概念,可能很多人说习惯了,就觉得镜头的分辨率和相机的分辨率是一样的。镜头的分辨率采用线对来表示,是只1mm内能分辨的黑白线对的数量,这个有个专业名词叫瑞利距离,想了解的可以去查一下。镜头、相机的选择与采集物体的视场有关系。这是一个相似三角形关系,可以看下面这个图,dw是工作距离,f是镜头焦距。通过这个可以确定视场大小,镜头焦距,相机分辨率,镜头分辨率,芯片大小等参数,从而实现硬件选型。其中要注意,镜头的分辨率一定要和相机的分辨率相适应,这样才能最大程度发挥相机的作用。

image.png

简言之,这三种硬件是计算机视觉最重要的硬件。做视觉的人需要了解这些硬件的参数,了解一些选择的方法。但是,也没有必要去精通这些硬件的选择,上面也提过,在实际应用中,更多的时候是通过硬件厂商来试具体哪种比较好,现场环境太复杂,一般没有办法一下子准确选择合适的硬件。只是了解了这些硬件选择知识,在项目前期进行准备的时候,做到心中有底,能够确定项目能够实施成功,项目的费用大概需要多少等等方面。还有,一般自己会准备几套光源相机和镜头作为实验用,这样对项目前期的采图比较有用,如果自己准备的硬件采集的图像不理想,也可以很快知道需要什么样的硬件。


闲来无事,谈谈计算机视觉

作者:wqiasky
链接:https://zhuanlan.zhihu.com/p/37637302
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

计算机视觉有时又称为机器视觉,两者之间其实没有什么大的区别,强调计算机视觉可能主要是强调计算机对图像处理分析方面,而机器视觉更多的是从工程应用出发,强调计算机视觉的应用,应该是一个系统。但是,我们平时说计算机视觉或机器视觉,两者之间也没必要分的那么清,因为他们的核心其实都是视觉图像的分析处理。

计算机视觉属于人工智能的一部分,而且是非常重要的一个领域。很多人想学习计算机视觉,可是不知道需要学习什么,要怎么学习,学完之后的应用在什么地方。而且,觉得计算机视觉是一个非常难得方向,总感觉无从下手。

首先了解下计算机视觉的应用。从大的方面说,理论上,只要技术上能实现,凡是人眼能够看见和处理的,都可以用计算机视觉来代替。当然,目前的技术发展还远没有到这一步。现在企业对于计算机视觉或机器视觉的应用主要集中在产品检测、识别、定位以及测量这些方面。比如检测产品表面是否存在缺陷、检测食品包装上的生产日期是否印刷完整,在流水线上定位产品的位置,从而指导机械手臂自动抓取等,在产品测量上,计算机视觉可以测量产品的外观尺寸。当然,具体的应用还有很多,远远不止这些,如果对这个行业深入了解,可以发现计算机视觉的应用实在太广泛了,不限于某个行业,或者说,几乎每个行业都会用到计算机视觉技术。并且,根据需求的具体要求不同,对视觉的要求也可能有很大的区别。目前,这类需求具有很大的市场,这些应用原来都是靠人工完成,现在基本上都可以靠视觉来实现。因此,很多行业都有这方面的需求。而且,这种需求会一直持续下去。因为,计算机视觉每个需求都是独立的,都需要独立开发相应的视觉系统来实现具体的需求。即使同样的检测对象,由于在不同的环境下采集图像,原来的检测系统在新的环境下一般不具有通用性,需要更改图像处理算法。而且,产品在更新,检测对象在变化,相应的视觉检测系统也要修改。而通常一套视觉检测系统的价格并不昂贵。除非某些特殊的要求,需要花费很大力气来研究专门的算法以及需要比较高的硬件设备。通常的视觉检测系统包括硬件软件在内,可能十来万块钱就可以搞定,但是如果采用人工来实现,人工成本是比较贵的,所以很多企业是希望采用计算机视觉代替人的。

其次,计算机视觉需要的硬件和软件。硬件部分主要包括相机、光源、镜头 、电脑。其他的一些辅助硬件一般就比较便宜了。做计算机视觉一定会涉及到硬件的选型。主要是相机、光源和镜头的选型。虽然很多教材大篇的在讲相机的参数、镜头的参数、光源的参数以及这些硬件怎么选型。其实在实际应用中,并没有那么复杂。选型的目的是采集出符合要求的图像。真正在实际应用中,图像的采集我们可以交给卖硬件的公司,他们会给你选好用哪种类型的硬件。你只需要提要求。当然,懂得一些硬件的选型知识还是必要的,免得连自己的要求都提不出来,别人也无法给你选型。而且,有了硬件选型的知识,自己也可以大致知道需要什么类型的硬件,避免被骗。还有,与客户谈需求的时候,你要预估采用什么样的硬件,怎么采集图像才能够实现视觉检测系统,大概需要的费用。如果没有硬件知识,也是无从下手,让别人觉得你是外行,肯定项目就不给你做了。

图像处理软件是整个视觉系统的核心。这也是大部分人觉得最难的部分。这里涉及到图像处理算法,需要编写代码。而很多人一看到写代码,就觉得很难,就开始打退堂鼓了。其实,现在图像处理算法都是调用现用的图像处理库来实现,很少自己写算法,最多就是在现有的算法上调调参数。所以,只要学过一点编程语言的,要入门计算机视觉都不是难事。现在的计算机视觉有点类似当年的机械三维建模。刚开始的时候,很多人觉得三维建模非常难,现在来看,也是非常简单。而视觉检测系统也就是调用已有的图像处理算法,将这些算法组合起来实现整个检测系统。所以,对于大多数的视觉应用而言,其实都不是很难。真正难得视觉系统,也是很多公司都做不了的,这部分这些公司也不愿意做,因为可能花了很多时间来做,最后的效果也不好,也不能产生多大的效益。一般比较难的应用就是找专门的算法研究者合作,这主要在一些高校里面在做,作为一个课题专门来研究算法,花费的时间比较长。

目前比较好的图像库主要是opencv,这是免费的,商业的有halcon,visionpro等,收费比较高。此外,matlab中有图像处理工具箱,labview中也有图像处理模块。其中opencv个人感觉是比较好的选择。首先是资料比较多,方便学习;其次,opencv不管是个人应用还是商业应用都是免费的,避免的版权纠纷;然后,通过学习opencv,可以了解很多图像处理算法的内部原理,从而更深入的进入到是视觉图像处理领域。而halcon这些软件虽然已经做得很好了,但是你在上面再提高自己的能力可能就比较难,你只能用他的函数库,而很多算法不知道具体的原理,而且,作为商业软件,这些是收费的,会增加项目实施的成本。

简言之,计算机视觉的应用会非常广泛。我们大部分人只是做视觉应用,没有必要去关注深度学习,大数据这些方面的研究,这些方面还是交给专门搞研究的人去弄。作为应用,计算机视觉的入门并不难,只要懂一些编程基础的人,不管原来学的是什么专业,自己加以学习,一般一两个月可以入门,如果有项目跟着做或者有人指导,进度会更快。作为人工智能中非常重要的一部分,往计算机视觉发展,应该是一个不错的方向。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864