尽管之前写过一篇关于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的图片数据(在内存里面可能是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函数,也就是这么来的。
分享到:
相关推荐
浅谈OpenCV计算机视觉库.pdf
【Halcon与Delphi(兼谈OpenCV)】 Halcon是一款源自德国的顶级机器视觉软件,以其高效能和丰富的功能在工业领域独占鳌头。它内置了一种简化版的Pascal脚本语言,使得开发过程更为高效。与Delphi的结合使用,形成了...
当我们谈到“编译opencv需要的ffmpeg文件”,这意味着在构建OpenCV时,FFmpeg库是作为其组件被集成的,以增强OpenCV在处理音视频方面的功能。 1. **FFmpeg和OpenCV的关系**: FFmpeg库为OpenCV提供了处理视频流的...
本文将浅谈OpenCV的基础知识,包括常见的图片格式、图片的本质以及如何使用OpenCV进行基本操作。 首先,我们来了解一下常见的图片格式。JPEG(jpg)是一种广泛使用的有损压缩格式,它能在较小的磁盘空间内保持较高...
在使用Python进行计算机视觉开发时,OpenCV是一个不可或缺的库。然而,在配置和使用OpenCV的过程中,新手常常会遇到一些问题。本文将深入探讨这些坑,并提供解决方案。 首先,我们来了解一下OpenCV的基本配置步骤。...
浅谈配置OpenCV3 + Python3的简易方法(macOS)
在OpenCV基础知识的第十部分,我们将深入探讨人脸识别项目,这是一个非常实用且广泛应用于各种场景的技术。OpenCV,全称为Open Source Computer Vision Library,是一个开源的计算机视觉库,它提供了丰富的功能,...
在Python的OpenCV库中,伽马变换是一个非常实用的功能,尤其适用于调整曝光过度或不足的图像。 伽马变换的公式通常表示为 `O = I^(1/gamma)`,其中 `I` 是原始图像的灰度值,`O` 是经过伽马校正后的灰度值,`gamma`...
【OpenCV介绍】 OpenCV(开源计算机视觉库)是一个跨平台的计算机视觉库,它包含了大量的图像处理和计算机视觉的算法,广泛应用于图像分析、机器学习和实时计算机视觉任务。OpenCV支持C++、Python等多种编程语言,...
在OpenCV库中,`connectedComponentsWithStats`函数是一个非常实用的工具,它用于处理二值图像,并且能够计算每个连通组件的统计信息。这个函数在OpenCV 3.0版本之后被引入,旨在提高处理效率和提供更丰富的信息。在...
是一个opencv写的眼球转动方向检测的程序,能够从视频中检测识别出眼球的转动方向并输出到屏幕,包括上、下、左、右
基于深度学习opencv计算机视觉的螺母螺栓产品质量智能检测项目python源码+模型.zip 【资源说明】 1.项目代码完整可靠,谈不上高分、满分(多数为夸大其词),但难度适中,满足毕设、课设要求,属于易上手的优质项目,...
而OpenCV是一个开源的计算机视觉和机器学习软件库,由一系列C++函数和少量C函数组成,实现了图像处理和计算机视觉方面的很多常见任务。Python与OpenCV的结合,使得用Python进行图像处理变得异常简单和高效。 Gamma...
配置OpenCV3和Python3的简易方法主要涉及在macOS环境下将这两者相结合,以便利用Python3进行图像处理和计算机视觉项目的开发。根据所提供的内容,下面我将详细阐述配置过程中的各个知识点,包括安装步骤、遇到的常见...
python配置与使用OpenCV时的常见问题与解决方法 1. OpenCV版本与Python版本匹配问题 在配置OpenCV时,必须确保所使用的OpenCV版本与Python版本相匹配。如果版本不匹配,Python将无法调用cv2模块,从而引发错误。...
在C++开发中,OpenCV是一个广泛使用的计算机视觉库,它提供了丰富的图像处理和计算机视觉功能。当使用CMake作为构建系统时,我们需要决定如何链接OpenCV库:静态链接或动态链接。这两种链接方式各有优缺点,选择哪种...
opencv提取图片轮廓 opencv版本为4.2.0 谈到图像处理的编程工具,opencv是最经常提到的,本次程序为提取图片轮廓的简单程序例程,大家可以试一下,作为入门opencv的第一步,也可以联系我,直接给你发程序内容!