目录
5、OpenCV配置以及Visual Studio使用OpenCV
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)
https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(专栏文章正在更新中...)
https://blog.csdn.net/chenlycly/category_12279968.html
C/C++基础与进阶https://blog.csdn.net/chenlycly/category_11931267.html
1、概述
在计算机视觉项目的开发中,OpenCV作为最大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。此外,OpenCV还提供了java、python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。
本文将主要介绍OpenCV开发的一些基础知识、入门上手的方法与步骤等。
2、OpenCV详细介绍
2.1、OpenCV的起源
OpenCV诞生于Intel研究中心,其目的是为了促进CPU密集型应用。为了达到这一目的,Intel启动了多个项目,包括实时光线追踪和三维显示墙。一个在Intel工作的OpenCV作者在访问一些大学时,注意到许多顶尖大学中的研究组(如MIT媒体实验室)拥有很好的内部使用的开放计算机视觉库-- (在学生们之间互相传播的代码),这会帮助一个新生从高的起点开始他/她的计算机视觉研究。这样一个新生可以在以前的基础上继续开始研究,而不用从底层写基本函数。
因此,OpenCV的目的是开发一个普遍可用的计算机视觉库。在Intel的性能库团队的帮助下 ,OpenCV实现了一些核心代码以及算法,并发给Intel俄罗斯的库团队。这就是OpenCV的诞生之地:在与软件性能库团队的合作下,它开始于Intel的研究中心,并在俄罗斯得到实现和优化。
俄罗斯团队的主要负责人是Vadim Pisarevsky,他负责管理项目、写代码并优化OpenCV的大部分代码,在OpenCV中很大一部分功劳都属于他。跟他一起,Victor Eruhimov帮助开发了早期的架构,Valery Kuriakin管理俄罗斯实验室并提供了很大的支持。在开始时,OpenCV有以下三大目标:
这些目标说明了OpenCV的起缘。计算机视觉应用的发展会增加对快速处理器的需求。与单独销售软件相比,促进处理器的升级会为Intel带来更多收入。这也许是为什么这个开放且免费的库出现在一家硬件生产企业中,而不是在一家软件公司中。从某种程度上说,在一家硬件公司里,在软件方面会有更多创新的空间。
2.2、OpenCV开发语言
OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#,Ch, Ruby的支持。
2.3、OpenCV的应用领域
OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库。 无论你是做科学研究,还是商业应用,OpenCV都可以作为你理想的工具库,因为,对于这两者,它完全是免费的。同时,由于计算机视觉与机器学习密不可分,该库也包含了比较常用的一些机器学习算法。或许,很多人知道图像识别、机器视觉在安防领域有所应用。但很少有人知道,在航拍图片、街道图片(例如google street view)中,要严重依赖于机器视觉的摄像头标定、图像融合等技术。
近年来,在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域,OpenCV可谓大显身手,而这些,仅仅是其应用的冰山一角。如今,来自世界各地的各大公司、科研机构的研究人员,共同维护支持着OpenCV的开源库开发。这些公司和机构包括:微软,IBM,索尼、西门子、google、intel、斯坦福、MIT、CMU、剑桥。
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:
而标准的API将简化计算机视觉程序和解决方案的开发。OpenCV致力于成为这样的标准API。OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度(注:OpenCV 2.0版的代码已显著优化,无需IPP来提升性能,故2.0版不再提供IPP接口)。下图为OpenCV与当前其他主流视觉函数库的性能比较。
3、OpenCV模块划分
OpenCV主体分为五个模块,其中四个模块如下所示:
OpenCV的CV模块包含基本的图像处理函数和高级的计算机视觉算法。ML是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI包含图像和视频输入/输出的函数。CXCore包含OpenCV的一些基本数据结构和相关函数。
目前,我们当前讨论的是OpenCV3.2.0版本。OpenCV3.0与OpenCV2.0的版本相比,他的主要改动如下:
4、OpenCV源码文件结构
开源库OpenCV的github地址为:https://github.com/opencv,下文以OpenCV3.0版本展开讲述。
4.1、根目录介绍
OpenCV3.0的sources文件结构如下:
4.2、常用模块介绍
modules目录中则包含了OpenCV的主要功能模块,包含了如下的多个模块:
4.3、CUDA加速模块
CUDA 是显卡制造商 NVIDIA 推出的通用计算语言,在cv3中有大量的模块已经被移植到了CUDA 语言:
5、OpenCV配置以及Visual Studio使用OpenCV
了解了OpenCV的数据结构和功能后,下面介绍OpenCV的配置,win7 64 + vs2013 + OpenCV3.0步骤。
经过以上的基础知识介绍后,就可以进行入门的实践了。在上面配置完成的工程中,来显示一幅图片,验证一下是否成功。在解决方案资源管理器中,打开源文件main.cpp(没有可以自己创6、建),添加以下代码
#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("lena.jpg"); //图片必须添加到工程目录下
imshow("src ", src);
waitKey();
}
然后编译代码执行程序,效果如下:
上图是视频图像处理领域最经典的Lena图片,做视频图像处理的朋友肯定都知道这个漂亮的小姐姐是谁!
6、关于Lena图片
图片中的女神名叫莱娜·瑟德贝里(瑞典文:Lena Soderberg),1951 年 3 月 31 日出生于瑞典,在 1972 年 11 月期的《花花公子》杂志中,她成为了当期的玩伴女郎(女模特),拍摄了一些照片。
在计算机图像界,Lena图是最受欢迎、使用最多的测试图,在图像处理领域,Lena 成为无人不知、无人不晓的女神。很多图像处理教程和会议论文都是用Lena图作为测试验证图,因此大多数图像处理学习者都是从这张图入门的,在网上也能搜到各种被处理过的相关图片:
因为这张图片,Lena 成为了计算机领域最著名的非专业女性,也是很多 CV 程序员们口口相传的女神。
在1973年6、7月间,美国南加州大学信号图像处理研究所教授Alexander Sawchuk正在与一名研究生以及SIPI研究室的经理正在匆忙地寻找一副高质量的图片用于大学的会议论文。他们不喜欢1960年代早期所使用的电视标准所用的普通检验图,他们希望找到一幅能够得到很好动态范围的有光泽的图像,并且希望能有一幅人脸图像。正在那时,碰巧有人走了进来并且带着一幅最近出版的《花花公子》。杂志上的Lena照片(Lena Soderberg,莱娜·瑟德贝里,1972年在在芝加哥当模特的瑞典人,是《花花公子》当年的十一月小姐)让教授眼前一亮。教授便将这张图扫描了下来,截取图片上半身的一部分(她的脸部与裸露的肩部)作为了他研究使用的样例图像。从此,这幅512*512的经典Lena图片就诞生了。
莱娜的这张照片在无意间竟然一炮而红!戴着柔软的羽毛帽子,站在一面全身镜前,回头凝视着观众,她裸露的右肩,眼睛在招手,嘴角挂着蒙娜丽莎式的微笑。自《蒙娜丽莎》以来,没有哪幅图像被研究得如此深入。该图在数字视频处理学习与研究中颇为知名,常被用作数字视频处理各种实验(例如数据压缩和降噪)及科学出版物的例图。莱娜图在图像压缩算法是最广泛应用的标准测试图—她的脸部与裸露的肩部已经变成了事实上的工业标准。
从事影像数据的压缩、运算、传输、 解压缩等处理时,都经常采用这张图像来当测试样本。 这张图片含有丰富的频段,包括处于低频的光滑皮肤和处于高频的羽毛,很适合做为测试图片。而人眼对于人脸的细节差别感受也远比一般的景物更为明显。
戴维·C·蒙森(David C.Munson),IEEE图像处理汇刊(IEEE Transactions on Image Processing)的主编, 在1996年1月引用了两个原因来说明莱娜图在科研领域流行的原因:
在 1997 年的第五十届 IS&T(图像科学与技术)大会上,Lena 被邀请为贵宾出席,在该会议上,她成了最受欢迎的人物,有人甚至把她称为 “The First Lady of Internet”(互联网第一夫人)。会议上,她做了自己的简要发言,并被无数的粉丝索取签名及拍照。
以现在的标准来看,Lena图片的分辨率比较低,随机计算机技术的发展,后面可能不再适合作为未来图像处理的测试图片。也许终有一天,它会被计算机图像学丢弃。但不可否认的是,它曾经在计算机图像领域做出过伟大的贡献。
7、OpenCV和OpenGL的区别
OpenCV和OpenGL都是用来处理图像和视频的,但两者有很大的区别。
OpenCV是一个开源计算机视觉库,用于图像和视频处理、分析和识别。它提供了各种算法和工具,如图像处理、特征检测、目标跟踪、人脸识别等,可以在计算机视觉应用中使用。
OpenGL是一个开源图形库,用于创建3D图形和动画。它提供了各种功能和工具,如渲染、光照、纹理映射等,它可以帮助开发人员实现高效的图形渲染和动画效果,可以与许多编程语言搭配使用,如C++、Java等。它应用于游戏、虚拟现实、建筑等多个领域。此外,OpenGL还提供了一个专用于嵌入式领域的OpenGL ES (OpenGL for Embedded Systems), 是 OpenGL 三维图形 API 的子集,主要针对手机、PAD和游戏主机等嵌入式设备而设计。
虽然OpenCV和OpenGL都可以用于图像处理和计算机视觉应用,但它们的定位和应用场景不同。OpenCV主要用于图像和视频的处理分析,而OpenGL则主要用于3D图形和动画的创建与渲染。
8、OpenCV与YOLO的区别
OpenCV和YOLO都是计算机视觉领域的工具库,但它们的作用和使用方式有所不同。
OpenCV是一个开源的计算机视觉库,提供了各种各样的图像处理和计算机视觉算法,如图像读取、图像处理、图像滤波、图像分割、边缘检测、特征提取、目标检测与跟踪、人脸识别等。OpenCV可以用于图像处理、视频处理、机器人视觉、自动驾驶等多个领域。
YOLO(You Only Look Once)是一个基于深度学习的开源目标检测算法。相比传统的目标检测算法,YOLO可以实现更快的检测速度,在保持较高的准确率的同时,可以实现实时检测。YOLO采用单个神经网络来同时预测图像中所有物体的类别和位置,可以处理多种尺度和多个物体。YOLO可以用于智能监控、自动驾驶、机器人视觉等领域。
因此,OpenCV和YOLO都是计算机视觉领域的工具,它们的应用场景和目标有所不同。OpenCV更加通用,可以用于各种图像处理和计算机视觉应用,而YOLO则更加专注于目标检测领域,可以实现实时目标检测,检测效率要高一些。
9、OpenGL与DirectX的区别
说到OpenCV和OpenGL的区别,我们也来顺便说说OpenGL与DirectX的区别。
OpenGL和DirectX都是用于渲染3D图形的API,但它们有较大的区别,如下:
总的来说,OpenGL和DirectX都有各自的优缺点,在选择使用哪个API时,需要考虑到项目需求、开发成本、平台支持等因素。以多媒体SDL库为例,我们经常使用该库在软件中绘制视频图像,当用在Windows平台上时SDL内部使用DirectX绘图,当用在Linux平台上时SDL内部则使用OpenGL绘图。