opencv零基础学习笔记(多长时间可以熟悉OpenCV)
opencv零基础学习笔记(多长时间可以熟悉OpenCV)计算机视觉能干什么?大体可以分为以下几类:检测、识别、分类、定位、测量。说得具体一点,检测表面划痕、异物检测,检测某个对象是否存在,检测是否完整等;识别人脸、识别车牌、识别字符、识别某个标志等图像上的对象;对图像上的对象进行分类,对混合在一起的产品进行分类;定位检测对象在图像中的位置,从而给机器人或者别的机构传递位置信息;测量图像中某个对象的尺寸。首先明确两个问题,第一个问题,计算机视觉和机器视觉有什么异同?其实两者没有太多区别,不必将其强行分开,两者的核心都是视觉图像处理。如果说一定有什么区别的话,计算机视觉可以专指用算法对视觉图像进行处理,而机器视觉是指工程应用的视觉系统,除了核心的图像处理之外,还包括图像采集用的相机、光源、镜头、传感器以及控制部分等。一个视觉系统就是可以直接应用在某个地方实现某种功能的完整的一套系统。第二个问题,什么是图像?不要把图像看得太神秘,简单地说,图像就是一
前几天我说熟悉OpenCV一周或两周就差不多了。今天我就详细分析下,为什么可以短时间掌握opencv。我主要从以下几个方面进行分析:
1、计算机视觉能干什么?
2、计算机视觉算法分类。
3、使用OpenCV的两类人群
4、学习OpenCV的难点在哪里?
5、OpenCV怎么学习?
1、计算机视觉能干什么?
首先明确两个问题,第一个问题,计算机视觉和机器视觉有什么异同?其实两者没有太多区别,不必将其强行分开,两者的核心都是视觉图像处理。如果说一定有什么区别的话,计算机视觉可以专指用算法对视觉图像进行处理,而机器视觉是指工程应用的视觉系统,除了核心的图像处理之外,还包括图像采集用的相机、光源、镜头、传感器以及控制部分等。一个视觉系统就是可以直接应用在某个地方实现某种功能的完整的一套系统。第二个问题,什么是图像?不要把图像看得太神秘,简单地说,图像就是一堆矩阵数字,尽管图像有很多种格式,除非专门做图像格式研究,做视觉的不去研究图像格式,顶多明白有哪些格式以及转换方法。视觉处理的时候,只是把这一堆矩阵数据读取出来进行处理。
计算机视觉能干什么?大体可以分为以下几类:检测、识别、分类、定位、测量。说得具体一点,检测表面划痕、异物检测,检测某个对象是否存在,检测是否完整等;识别人脸、识别车牌、识别字符、识别某个标志等图像上的对象;对图像上的对象进行分类,对混合在一起的产品进行分类;定位检测对象在图像中的位置,从而给机器人或者别的机构传递位置信息;测量图像中某个对象的尺寸。
2、计算机视觉算法分类
为了实现计算机视觉检测、识别、分类、定位以及测量等任务,就需要相应的视觉图像处理算法。我们可以把这些算法大致进行了分类,分类可能不太准确,也不太完善,但是不影响学习,也可以作为参考,见图1。其中,深度学习算法其实是机器学习算法的一种,这里单独列出来了。
图1 常用算法
记住一点,图像处理到最后基本上都是把特征提取出来进行判断。所有的预处理算法都是为提取特征而服务的。以图2为例。如果我们要测量圆的直径,就要想办法把圆的边界找出来,如果我们要判断圆的数量,我们就可以把圆分割出来,如果我们要定位圆的位置,我们就需要把圆心提取出来。这些都是提取特征,由于直接提取图像特征可能效果不太好,所以我们先通过一些算法对图像进行处理,从而方便最后的特征提取。
图2
有了这些算法之后,我们要弄清楚每种算法在干什么,拿到一幅图像,弄清楚我们的目标是干什么。比如识别和分类,我们需要先把对象提取出来进行训练,比如测量定位我们需要把几何特征找出来,比如缺陷检测,我们需要把缺陷区域找出来进行判断。
3、使用OpenCV的两类人群
做计算机视觉的可以分为两种人群,应用开发人员和算法研究人员。其中真正做算法理论研究的是极少部分,更多的人是算法应用研究和算法应用。首先,说一下是不是任何做视觉的人都必须要明白每个算法的原理。
我们看到一个算法的时候,第一反应是什么?是这个算法有什么用。然后呢?我们想知道这个算法是怎么实现的。所以,不管做算法研究还是应用的人,首先关心的是这个算法有什么用,然后通过实验看下效果。到此,做应用的人就开始调试下各种参数,看应用效果如何?而研究理论的人呢,则开始关心这个算法的原理,有什么特点,有什么不足,有什么改进方法。
所以,不管哪类人员,首先关心的是算法的作用,离开使用,空谈理论的话是很难做出效果的。因此,每类人员都需要先明白算法的作用,算法如何使用,这是基础。只有在此基础上,才可以谈应用或者深入研究理论方法。
我们必须认识到,做算法研究的人,是很少一部分。而且,这些人只关注某一类算法的研究,不可能对所有算法进行研究。因为,人的精力是有限的,对其它的算法是没有时间和精力做深入研究的。就算有,也是需要花费好多年才能够做到。不管是谁,如果让他说出他说知道的算法的原理,估计没多少人能讲清楚。但是,这并不影响他使用该算法,因为,他知道这些算法是干什么的。
关于这一点,每个做视觉应用和研究的人都可以思考下,是否是这样?自己是否完全了解自己知道的那些算法的原理?
那为什么有的人看到一幅图像,很快就可以处理得到结果,有些人却不知所措呢?其实是这些人对于算法应用的熟练掌握,而不是对算法原理的熟练掌握。换句话说,就是练习多了,熟练了,就知道了很多算法的用途,然后可以很快将算法进行组合和参数调整得到结果。
所以,对于做视觉的人,要不要懂算法,答案是,当然要懂。但是,需要懂到什么深度呢?是不是对每个算法原理都要非常清楚?其实不是,这样也不现实,也做不到,就算一直做算法研究开发的人,也不可能把那么多算法的原理弄清楚。其实我上面已经提到了,对于很多算法,只需要知道算法的用途,知道怎么用就可以了。
为什么我们刚开始学习的时候,拿到一幅图像,不知道怎么下手?其实是因为我们知道的算法太少了,我们知道的同一种算法的应用方法也太少了。那怎么才能够熟悉更多算法的使用呢?关于这一点,已经在很多场合证明了。有不少在学校做图像算法研究的人,由于只关注少量算法的理论,结果是文章发出来了,但是到了实际应用现场,解决不了实际问题。他们在某种类型算法上的理论可能研究较深,但是很多应用现场不是靠某一类或几类算法就可以实现的。最典型的就是只会深度学习,结果不好就不停地加数据和调参数。其实换个思路,如果把图像做一些预处理,或者先提取某种类型的特征,再进行训练和识别,可能效果就完全不一样。但是他不知道别的算法的应用啊,所以结果不理想。
目前很少有资料将这些算法集中起来,让大家直观感受到每个算法的应用方法和应用结果,大家都是零散地学习了一些方法。因此,我们需要将这些算法归纳总结出来,让大家直观看到每个类别的算法,看到每个算法是怎么用的,结果是什么样子的,这样就一目了然。不管是做应用还是做研究,我们可以问下自己,我们到底了解多少?把知道的算法以及作用写下来,然后自己对照看下,我估计能写出20个的不多,能写出50个的更少。那就要想一下了,我们说做图像难,到底难在哪里了?所以我建议,以后视觉公司招人的时候,就让人把知道的算法以及作用写出来,写得越多就越熟悉。如果有哪些算法都不是很清楚,对算法的用途都不是很熟悉,那做起来当然难了。
4、学习OpenCV的难点在哪里?
做视觉少不了要用到图像库,因为不可能所有算法都自己写,那样估计对不少企业而言,所有算法写完企业离解散也不远了。大家都说OpenCV有点难,到底难在哪里?我想,难点主要在以下几个方面:
(1)计算机编程能力不够
如果不是学计算机专业的,那么,有些人的编程能力不足,需要加强。有的人使用camke自己编译OpenCV的图像库可能就要折腾半天,严重打击学习积极性,后面OpenCV的环境配置,如果采用c ,也会让部分人觉得好麻烦。那么,这个难与学习OpenCV本身没有什么关系。如果采用python或者emgucvc,则配置opencv要相对简单很多。另外,虽然cmake自己编译比较麻烦,但是已经有很多编译好的OpenCV库,我给的地址也有采用vs2015编译好的OpenCV库,这部分不应该对学习造成困难。
(2)写代码很麻烦
就算有一些计算机编程基础的人,要一行一行的敲代码,也是很麻烦的事情,尤其是本来就是刚开始接触OpenCV,对OpenCV又不是很熟,学起来很慢,就会觉得很烦,从心里觉得好像很难的样子,这是实际存在的问题,又要写代码,又要调试结果,结果不理想有返回来修改代码,反反复复确实很麻烦,效率又低,效果也不好。
(3)觉得要看懂算法很难
首先,前面已经分析了,其实大部分算法我们只需要知道是干什么的,只需要懂得算法的作用和怎么用的就好了。试想一下,拿到一张图像,就算你真的懂了每个算法的原理,你能够马上知道怎么处理?而且,知道需要什么样的参数吗?恐怕不能,还是通过不断的试算法,看效果如何。不信的可以试一下,就以上面的图2为例,如果我们要知道图中有多少个圆,你想一下需要什么算法,然后试一下你的想法。顺便想一下你是否清楚明白你想用的算法的原理。
所以,我们有些人做起来很快,更主要的原因是熟能生巧,做得多,练习多,使用的算法多了,自然心里就有想法,很快通过不同的算法应用,得到最后的结果。就像我们开车,并不需要知道怎么造车,我们学会了开车,通过不停地开车,车技就熟练了,自然就可以把车开好了。
如果真要看算法原理,那么,算法是不是真的很难呢?其实,大部分算法不难,在这里我不讲算法原理,大家可以对照图1列出来的算法理解下。
我要说明一点,就算今天看懂了十个算法的原理,过一段时间,估计大部分算法的原理都说不清楚了,但是并不影响你使用这些算法,因为你已经知道了这些算法的作用和使用方法。
那么,理解这些算法的作用很难吗?其实绝大部分算法的原理都不是很难理解,更不用说算法的作用了。算法的作用类别就那么几种,分割就是把图像分成几部分,形态学基本的就是膨胀腐蚀,边缘检测就是像素值相减,均值滤波就是算了个平均值,增强就是把某些像素值变大,某些像素值变小。模板匹配就是用模板遍历图像做了个比较,几何变换就是旋转平移坐标变换等,轮廓就是一种特征,直方图就是统计结果,特征点检测算法就是找出不同的点。特征提取就是提取了一堆数字,机器学习就是把一堆数字用来训练和识别。深度学习训练结果也是一堆数字。
以上虽然我说得有点片面,但也大致差不多。就不要详细说明每个算法的原理了。所以说明两点,第一,不要觉得算法有多难,绝大部分算法原理不难,第二,原理不可能每个算法都理解,但是熟练算法的应用,才是做好视觉的基础。如果纯做某一类算法理论研究,才需要仔细研究该算法的原理。那么,明白算法的作用,我想对每个人都不是难事了。而熟悉OpenCV中的算法作用和使用方法,需要多长时间?
(4)开发视觉系统很难
对于做视觉系统开发的来说,如果不熟悉某个开发工具,当然有点难,但是,这个与图像算法的应用没有多少关系。更多的是对开发工具不熟悉,比如用qt、c#开发等,如果要做视觉系统,当然至少熟悉一种开发工具。如果只对算法应用熟悉,以后有人帮你做系统的话,你可以专注于是视觉算法的应用。
5、OpenCV怎么学习?
最后,OpenCV怎么学?我想,针对以上的难点,我已经给出了解决方法。当前主流的图像处理库,商业的用HALCON、visionpro,开源的是OpenCV以及对应的c#版本,其他如matlab、LabVIEW等有图像处理库。很多人学习OpenCV还是采用很原始的学习方法,当然需要花很多时间。
比如:有的人在网上看视频,一行一行敲代码,跟着做,时间周期长,做完之后又忘了,有的人在培训班学习,还是一行一行敲代码,有的人买书照着敲代码,有的人在网上查阅点零散的资料敲代码。这样当然慢了,有这个时间敲代码,干嘛不把这个时间用在熟悉开发工具上,把python、c 、c#、qt等熟悉了不是更好吗?
不要通过敲代码来熟悉OpenCV。那样肯定需要很长的时间,而且学完之后不久又忘了,遇到问题又到处找资料。此外,敲代码调试也需要花费大量的时间,几个函数组合在一起,每个函数处理结果是什么样子的,又要调试出来看结果,不行的话,又重新来写代码,这样肯定快不起来。
用过HALCON或者visionpro的人都知道,你不需要任何编程基础都可以使用。你只需要知道每个算法是干什么的,通过点击鼠标,输几个参数就出来结果了。HALCON和visionpro是商业软件,里面有些算法的原理根本就看不到,那是怎么用起来的?所以,不要纠结于算法的原理。我们懂算法的原理对应用有帮助,但不是必须的,每天拿几张图像出来练习,自然就对算法的应用熟悉了,然后自然就会思考该算法的原理是什么。但是如果你是敲代码的方式,一天也熟悉不了几个。
很多年前,我也是买了些书,照着书上一行一行敲代码,连续一两个月,将书上的代码一行一行敲进去的,说实话,敲完之后我还是有点蒙,可能我天生就比较笨吧。现在回想起来,真的太浪费时间了,后来我使用HALCON的时候,不到一周就熟悉了,这也是促使我开发这个学习工具的原因。
当然,不排除少数人对很多算法原理都清楚掌握,可毕竟是少数。另外,我不是说算法原理不重要,算法原理很重要,但不是对应用算法的人,理解算法原理对算法研究和算法开发的人非常重要。理解少数算法原理对应用帮助不大,熟练掌握大量算法的使用对应用非常重要。深入研究某一类算法的理论对做算法研究的人很重要。此外,我也经常说做视觉要懂原理更好,因为懂原理的人是一定懂算法作用和使用方法的人,并且还有可能在算法的基础上进行改进。
所以,最后我总结一下,学习OpenCV真的不需要那么多时间,关键是找对方法。熟练掌握这些算法的使用方法是应用和理论研究的基础。以前学习OpenCV的主要时间在写代码和调试代码上了,现在我帮你解放出来,你可以专注于算法的应用和算法的理论学习。另外,算法的详细原理我也在逐渐集成在帮助文档中,也不需要到处找资料了。
如果你只是在搞深度学习,准备发表点文章,而对别的图像处理算法不关心,我不推荐使用我的这个学习平台,但是我也不建议这样做。最好尽快熟悉各种图像处理算法的使用,对你的深度学习研究和应用也有帮助。
如果你只是做算法理论研究,应该先熟悉每种算法的使用和基本原理,我建议使用。其实熟悉了使用,在使用过程中,会发现算法的一些缺陷,对做理论研究和应用研究都大有帮助。
如果你想快速掌握OpenCV的使用,我强烈推荐使用;如果你想在OpenCV上做应用开发,我强烈推荐使用;如果你是在学习OpenCV,我强烈推荐使用。
所以,您觉得掌握OpenCV需要多少时间?喜欢或想从事计算机视觉的你,逼一下自己,就会发现自己有多棒!