再谈OpenCV

来源:互联网 发布:淘宝信誉积分怎么算 编辑:程序博客网 时间:2024/06/06 01:20
再谈OpenCV
标签: api算法人脸识别图像处理工作avi
18508人阅读 评论(38)收藏举报
本文章已收录于:
分类:
作者同类文章X
            尽管之前写过一篇关于OpenCV的介绍(http://blog.csdn.net/carson2005/article/details/5822149),但依然有朋友对其不甚了解。所以,经常能碰到有人问我诸如以下一些问题:OpenCV能不能实现人脸识别?OpenCV有没有车辆检测的API?OpenCV有没有三维重建的函数?面对这样的问题,我也很困惑。到底该如何给他们解释,才能让它们明白,OpenCV确实很强大,但还没有他们想象中的那么强大。其实,OpenCV的全称,是Open source Computer Vision Library,开放源代码计算机视觉库。也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着,(1)不管是科学研究,还是商业应用,都可以利用它来作开发;(2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;(3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。但是,作为一个库,它所提供的,仅仅是一些常用的,经典的,大众化的算法的API。一个典型的计算机视觉算法,应该包含以下一些步骤:(1)数据获取(对OpenCV来说,就是图片);(2)预处理;(3)特征提取;(4)特征选择;(5)分类器设计与训练;(6)分类判别;而OpenCV对这六个部分,分别(记住这个词)提供了API。下面我分别就这六个部分对一些常见问题进行必要的解释。

            对于数据获取,计算机视觉领域的数据,无非就是图片和视频两种。图片,有bmp,jpg,png,tiff....各种压缩和非压缩格式。所以,对压缩格式的图片而言,OpenCV内部必然包含了对应的图片解压缩函数(一般都是包含了开源的图片解压函数库,例如,对于jpg压缩格式而言,就包含了libjpg开源库)。而对于视频而言,常见的有.rmvb,.avi,.asf等格式,不同的格式,代表着不同的视频压缩算法(对于AVI格式,尽管都是avi格式,但内部的压缩算法仍然不相同。具体原因请参考我的另一篇博客:http://blog.csdn.net/carson2005/article/details/6314089),也就需要对应的解压算法来解压。尽管OpenCV提供了一些读写视频文件的API,但是,它也仅仅是一个接口而已,其内部,依然需要调用相应的视频编解码器的API来进行解码。常用的视频编解码器有:xvid,ffmpeg等。也就是说,如果你想利用OpenCV来进行视频读写之类的操作,是需要安装此类视频编解码器的。安装了相应的视频解码器之后,你就可以调用OpenCV的视频相关API来进行视频文件的读取操作了,当然,视频文件被解码之后,变成了一张一张的图片,然后才能被OpenCV所处理。另外,还有一种情况,就是数据来自于相机,包括数字相机和模拟相机。不管是哪种相机,你都要想办法获取到相机发送给PC的图片数据(PC在内存里面接收到的来自相机的数据可能是jpg格式,也可能是bmp格式)。如果,你在PC内存中接收到的是相机发送过来的jpg压缩格式,还需要进行图片数据的内存解压。关于相机和OpenCV的这部分内容,请见我另一篇博客:

    http://blog.csdn.net/carson2005/article/details/6243476

            对于预处理,一般就是去除或者降低噪声,光照归一化,亮度归一化,模糊化,锐化,膨胀,腐蚀、开闭等这些操作(详见,冈萨雷斯,《数字图像处理》一书)。而对于这些操作,OpenCV分别(又提到这个词了)提供了相应API函数。而光照的预处理,OpenCV提供了一个直方图均衡化的API,后续可能会提供一些gammar矫正之类的函数。

            对于特征提取,个人认为,可以算是整个计算机视觉系统中最为复杂也最难的部分(纯属个人意见,如有异议,请保留),到底什么是特征,该如何来理解这个看似简单却又包罗万象的名词呢?其实,要想仔细解释,还真的花费很多时间(有兴趣的可以看看,Richard O.Duda(著),李宏东(译),《模式识别》,机械工业出版社)。简单点说,特征,就是一个可以将若干个类别可以尽量分开的一种描述。举例来说,如果你要进行男人和女人的分类,显然,用“身高和体重”这一描述来衡量,是可以的,但是,这两个描述没有“胸部大小”这一描述更加准确,而“胸部大小”这一描述,又没有“喉结的有无”这一描述更准确。很显然,“身高和体重”,“胸部大小”,“喉结的有无”,这三种描述,都可以用来进行男人和女人的分类,只不过,它们对事物的描述的准确(或者说全面)程度是不同的,而诸如此类的描述,有一个更加专业的称谓,叫做“特征”。OpenCV里面,提供了一些特征描述的API,比如,对于人脸检测而言,它提供了haar特征的API,行人检测,提供了hog特征的API,甚至,它提供了LBP纹理特征的API。但是,这些还远远不够。例如,如果你要进行字符识别,OpenCV并没有提供字符识别所对应的特征。这个时候,就需要你自己来编程实现了。当然,该选择什么特征来描述字符呢?哪些特征更好呢?对于这些问题,我建议你去阅读相应的会议,期刊,杂志,硕士、博士毕业论文(毕竟硕士、博士研究生本就该从事“研究”工作),看看别人写的文章,自然就知道了。

            对于特征选择,OpenCV并没有提供特定的函数来进行衡量。而特征的分类能力的高低评价,有很多种分析方法,有兴趣的朋友,可以阅读"《机器学习》Tom. Mitchell(著),曾华军(译),机械工业出版社"这本书;

            对于分类器部分,OpenCV提供了SVM,CART,boost,bayes,bdt,ANN,这几种常用的算法。而这些基本已经覆盖了常用的分类器。所以,你需要做的,就是知道怎么调用其接口,各种分类器的优点和缺点(该部分,建议阅读“机器学习”这本书)。

            通过以上的分析,你或许已经发现,OpenCV不过是一个工具而已。或者,你可以将它理解为幼儿园小朋友过家家玩的积木,而OpenCV中的函数,则可以理解为一个一个的积木块,利用所有或者部分积木块,你可以快速的搭建起来具体的计算机视觉方面的应用(比如,字符识别,车牌识别,遗留物检测)。想必你也已经发现,在利用OpenCV这个积木来搭建具体的计算机视觉应用的时候,真正核心的,应该是这些积木块,如果你明白了积木块的工作原理,那么,是不是就可以不用这些积木块了呢?完全正确!不过,一般部分情况下,我们不需要这么做,因为,OpenCV已经帮你做好了一些工作(已经帮你做好了一些积木块,直接拿来用就是了)。但是,诸如前面提到的特征提取模块,很多情况下,OpenCV就无能为力了。这个时候,你就需要翻阅计算机视觉、模式识别、机器学习领域顶级会议、期刊、杂志上面发表的文章了。然后,根据这些文章中阐述的原理和方法,来编程实现你要的东西。实际上,也就等于搭建一个属于你私有的积木块。其实,OpenCV中的每一个API函数,也就是这么来的。

    65
    0
     
     

    我的同类文章

    http://blog.csdn.net
    • 图像视觉领域部分开源代码2016-03-28
    • 一文读懂卷积神经网络2016-03-21
    • 压缩跟踪Compressive Tracking2015-09-25
    • 时空上下文视觉跟踪(STC)算法的解读与代码复现2015-07-29
    • OpenCV300 CMake生成工程项目过程中的问题2015-06-05
    • 国内从事红外热成像的公司2015-05-27
    • opencv全屏显示2016-03-22
    • 双线性插值2016-01-05
    • Correlation Filter in Visual Tracking系列二:Fast Visual Tracking via Dense Spatio-Temporal Context Lear2015-09-19
    • opencv二值图孔洞填充算法2015-06-30
    • 查询GPU是否支持CUDA2015-06-04
    更多文章

    参考知识库

    更多资料请参考:
    猜你在找
    Python算法实战视频课程--队列的应用
    Python算法实战视频课程--栈的应用
    数据结构和算法
    数据结构基础系列(1):数据结构和算法
    征服JavaScript高级程序设计与应用实例视频课程
    再谈OpenCV数据结构Mat详解
    再谈OpenCV
    再谈OpenCV
    OpenCV学习笔记四十再谈OpenCV数据结构Mat详解
    OpenCV学习笔记四十再谈OpenCV数据结构Mat详解
    查看评论
    32楼 皮熊2015-03-17 15:07发表 [回复] [引用][举报]
    不错
    31楼 yangqin5002014-03-26 16:18发表 [回复] [引用][举报]
    跟大神学opencv!
    30楼 billionth2013-12-22 12:59发表 [回复] [引用][举报]
    很好的描述,男人、女人~ 对于初入OpenCV的同学很有帮助啊!
    29楼 hahkt2013-12-17 11:26发表 [回复] [引用][举报]
    最后一段,点出作为初学者的我的迷茫,谢谢。
    28楼 紫荆飘香V2013-12-12 01:12发表 [回复] [引用][举报]
    特征提取也是很多论文创新的地方。
    27楼 zleisure2013-11-16 21:36发表 [回复] [引用][举报]
    11年的帖子13年看到也很受益,谢谢
    26楼 小村长2013-11-14 14:12发表 [回复] [引用][举报]
    写的非常好 赞个!
    25楼 rocky692013-05-26 08:24发表 [回复] [引用][举报]
    基本應用可以拉,不過遇到圖很大的時候就會有效率的問題
    所以在做圖像辨識還是得看專案的成本來考慮,是要用付費還是免費的計算機視覺庫
    24楼 shencon2013-04-04 10:05发表 [回复] [引用][举报]
    对初学者来说是不错的推荐
    23楼 碧水无痕2012-12-25 20:42发表 [回复] [引用][举报]
    不错 非常感谢
    22楼 naruto00012012-11-10 16:54发表 [回复] [引用][举报]
    好帖子要顶啊。
    21楼 qjttxz2012-06-09 17:14发表 [回复] [引用][举报]
    OPENCV提供的都是基础,能不能用都是看个人的了。我都是用OPENCV的结构进行算法实现并且实现了一些功能,例如汽车识别(http://blog.csdn.net/qjttxz/article/details/7640501)。
    Re: ChenLee_12012-06-09 22:47发表 [回复] [引用][举报]
    恩,就是个工具而已;但很多人不明白,工具的含义,所以就由了这篇文章;主要是给初学者介绍一些基本概念吧;回复qjttxz:
    20楼 xdyang2012-03-22 10:18发表 [回复] [引用][举报]
    最近正在研究OpenCV,顶一个。
    个人认为配合研究OpenCV最好的一本书是Sonka等的《图像处理,分析和机器视觉》第三版,很全面,也比较新,基本上OpenCV里面的算法都涉及到了。另外,Duda的那本书叫模式分类,呵呵。
    Re: ChenLee_12012-03-22 21:37发表 [回复] [引用][举报]
    回复dcraw:恩,我只有中文版的,你有英文版的没?有的话,发我一份,qq1079185264
    19楼 add01242012-02-27 19:43发表 [回复] [引用][举报]
    对于我们这些初入学的菜鸟,很有帮助
    18楼 lhhappy20122012-02-10 11:58发表 [回复] [引用][举报]
    受益匪浅
    17楼 w8353699502012-01-05 08:22发表 [回复] [引用][举报]
    谢谢哦,亲
    16楼 蓝血人2011-11-23 12:23发表 [回复] [引用][举报]
    非常好,谢谢了啊
    15楼 THXK2011-11-22 23:36发表 [回复] [引用][举报]
    主要是这东西改改就成中国自主创新的核心技术,拿着可以去报效党国。
    14楼 铭毅天下2011-11-22 22:38发表 [回复] [引用][举报]
    写的挺好的,最近学习OPenCV仿真,受教了。
    13楼 Xellos2011-11-22 19:17发表 [回复] [引用][举报]
    很棒的OpenCV介绍文章!!感谢分享!!
    12楼 gcn_32011-11-21 20:10发表 [回复] [引用][举报]
    很好
    还有些基础的吗
    Re: ChenLee_12011-11-22 23:03发表 [回复] [引用][举报]
    回复gcn_3:再基础,就是一些入门书籍的推荐了。尤其是,数字图像处理,模式识别,机器学习方面的。我有一篇博客专门写入门的书籍推荐,建议你看看。
    11楼 赵4老师2011-11-21 16:55发表 [回复] [引用][举报]
    Mat temp;
    CvMat tmp;
    void gamma_correct(Mat& img, Mat& dst, double gamma) {
    img.convertTo(temp, CV_32FC1, 1.0/255.0, 0.0);
    tmp=temp;
    cvPow(&tmp, &tmp, gamma);
    temp.convertTo(dst , CV_8UC1 , 255.0 , 0.0);
    }


    0 0