opencv概述
了解OpenCV1、概述2、OpenCV详细介绍2.1、OpenCV的起源2.2、OpenCV开发语言2.3、OpenCV的应用领域3、OpenCV模块划分4、OpenCV源码文件结构4.1、根目录介绍4.2、常用模块介绍4.3、CUDA加速模块5、OpenCV配置以及Visual Studio使用OpenCV6、关于Lena图片7、OpenCV和OpenGL的区别8、OpenCV与YOLO的区别9、OpenGL与DirectX的区别了解OpenCV1、概述在计算机视觉项目的开发中OpenCV作为最大众的开源库拥有了丰富的常用图像处理函数库采用C/C语言编写可以运行在Linux/Windows/Mac等操作系统上能够快速的实现一些图像处理和识别的任务。此外OpenCV还提供了java、python、cuda等的使用接口、机器学习的基础算法调用从而使得图像处理和图像分析变得更加易于上手让开发人员更多的精力花在算法的设计上。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有以下三大目标1为基本的视觉应用提供开放且优化的源代码以促进视觉研究的发展。能有效地避免“闭门造车”。2通过提供一个通用的架构来传播视觉知识开发者可以在这个架构上继续开展工作所以代码应该是非常易读的且可改写。3本库采用的协议不要求商业产品继续开放代码这使得可移植的、性能被优化的代码可以自由获取可以促进基于视觉的商业应用的发展。这些目标说明了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如今的计算机视觉软件大概有以下三种1研究代码慢不稳定独立并与其他库不兼容2耗费很高的商业化工具比如Halcon, MATLABSimulink3依赖硬件的一些特别的解决方案比如视频监控制造控制系统医疗设备这是如今的现状。而标准的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.4.6版本。OpenCV3.4.6与OpenCV2.0的版本相比他的主要改动如下1大体上保留了OpenCV 2经典的C和Python编程接口风格。其中Python接口大大增强也加入了Python 3.x的支持。一般来说以前版本的程序只要做少数修改就可以使用OpenCV 3了。另外还改善了Java接口并且加入了MATLAB支持。2架构调整。图片、视频编解码从highgui模块分离出来组成了imgcodecs和videoio。原先的OpenCL模块ocl事实上与其 它模块融为一体而CUDA加速模块gpu分解成了数个以cuda开头的模块。此外除了官方支持的OpenCV代码还有一些自发贡献的内容、不稳定的 内容或者版权尚存争议的内容都放到了新的仓库opencv_contrib中。3更多新算法。新版本包括了TLD、鱼眼镜头模型等全新算法还包括了一些更高层次可以直接拿来用的高级封装比如汽车检测等。4引入T-API使OpenCL加速更容易。目前可以参考OpenCV源代码中T-API的范例。可以发现开启和关闭OpenCL加速只需要一个语句就够了。这也就是为什么ocl模块会消失了吧。5更多指令集优化。除了之前为Intel CPU做的优化以外OpenCV 3还容纳了ARM平台NEON指令集的支持。通过英特尔的帮助OpenCV 3对x86和x64平台默认使用IPP。OpenCV3.0中部分函数得到加速的示意图如下4、OpenCV源码文件结构开源库OpenCV的github地址为github下文以OpenCV3.0版本展开讲述。4.1、根目录介绍OpenCV3.4的sources文件结构如下13rdparty/包含第三方的库比如视频解码用的 ffmpegjpg、png、tiff等图片的开源解码库。2apps/包含进行 haar 分类器训练的工具opencv 进行人脸检测便是基于 haar 分类器。如果你想检测人脸以外的图片千万不要错过这几个工具。3cmake/包含生成工程项目时 cmake 的依赖文件用于智能搜索第三方库普通开发者不需要关心这个文件夹的内容。4data/包含 opencv 库以及范例中用到的资源文件haar 物体检测的分类器位于haarcascades子文件中。5doc/包含生成文档所需的源文件以及辅助脚本。6include/包含入口头文件。opencv 子文件夹中是 C 语言风格的API也就是《Learning OpenCV 第一版》中描述的API函数官方将逐渐淘汰 C 风格函数因此我不推荐大家使用该文件夹中的头文件。opencv2 子文件中只有一个 opencv.hpp 文件这是 cv2 以及 cv3 推荐使用的头文件。7modules/包含核心代码opencv 真正的代码都在这个文件夹中。opencv 从2.0开始以模块的方式组织各种功能近两年模块的数量增长得很快后面我会依次介绍每个模块的作用。8platforms/包含交叉编译所需的工具链以及额外的代码交叉编译指的是在一个操作系统中编译供另一个系统使用的文件。9samples/范例文件夹。4.2、常用模块介绍modules目录中则包含了OpenCV的主要功能模块包含了如下的多个模块1androidcamera/仅用于android平台使得可以通过与其他平台相同的接口来控制android设备的相机。2core/核心功能模块定义了基本的数据结构包括最重要的 Mat 类、XML 读写、opengl三维渲染等。3imgproc/全称为 image processing即图像处理。包括图像滤波、集合图像变换、直方图计算、形状描述子等。图像处理是计算机视觉的重要工具。4imgcodec/负责各种格式的图片的读写这个模块是从以前的 highgui 中剥离的。5highgui/高级图形界面及与 QT 框架的整合。6video/视频分析模块。包括背景提取、光流跟踪、卡尔曼滤波等做视频监控的读者会经常使用这个模块。7videoio/负责视频文件的读写也包括摄像头、Kinect 等的输入。8calib3d/相机标定以及三维重建。相机标定用于去除相机自身缺陷导致的画面形变还原真实的场景确保计算的准确性。三维重建通常用在双目视觉立体视觉即两个标定后的摄像头观察同一个场景通过计算两幅画面中的相关性来估算像素的深度。9features2d/包含 2D 特征值检测的框架。包含各种特征值检测器及描述子例如 FAST、MSER、OBRB、BRISK等。各类特征值拥有统一的算法接口因此在不影响程序逻辑的情况下可以进行替换。10objdetect/物体检测模块。包括haar分类器、SVM检测器及文字检测。11ml/全称为 Machine Learning即机器学习。包括统计模型、K最近邻、支持向量机、决策树、神经网络等经典的机器学习算法。12flann/用于在多维空间内聚类及搜索的近似算法做图像检索的读者对它不会陌生。13photo/计算摄影学。包括图像修补、去噪、HDR成像、非真实感渲染等。如果读者想实现Photoshop的高级功能那么这个模块必不可少。14stitching/图像拼接可用于制作全景图。15nonfree/受专利保护的算法。包含SIFT和SURF从功能上来说这两个算法属于features2d模块的但由于它们都是受专利保护的想在项目中可能需要专利方的许可。16shape/形状匹配算法模块。用于描述形状、比较形状。17softcascade/另一种物体检测算法Soft Cascade 分类器。包含检测模块和训练模块。18superres/全称为 Super Resolution用于增强图像的分辨率。19videostab/全称为 Video Stabilization用于解决相机移动时拍摄的视频不够稳定的问题。20viz/三维可视化模块。可以认为这个模块实现了一个简单的三维可视化引擎有各种UI控件和键盘、鼠标交互方式。底层实现基于 VTK 这个第三方库。常见模块core提供了基本的数据结构和功能如矩阵操作、像素操作和基本数学操作等。imgproc包含了图像处理函数如滤波、边缘检测、形态学运算等。video用于视频处理包括视频的读取、写入、光流估计等。features2d提供了特征检测和特征描述子相关的功能如SIFT、SURF等算法。objdetect用于对象检测包括人脸检测、目标识别等。calib3d用于相机标定和三维重建等。dnn支持深度学习模型的加载和推理。highgui提供了简单的GUI交互界面如显示图像和视频、接收用户输入等。4.3、CUDA加速模块CUDA 是显卡制造商 NVIDIA 推出的通用计算语言在cv3中有大量的模块已经被移植到了CUDA 语言1cuda/CUDA-加速的计算机视觉算法包括数据结构 cuda::GpuMat、 基于cuda的相机标定及三维重建等。2cudaarithm/CUDA-加速的矩阵运算模块。3cudabgsegm/CUDA-加速的背景分割模块通常用于视频监控。4cudacodec/CUDA-加速的视频编码与解码。5cudafeatures2d/CUDA-加速的特征检测与描述模块与features2d/模块功能类似。6cudafilters/CUDA-加速的图像滤波。7cudaimgproc/CUDA-加速的图像处理算法包含直方图计算、霍夫变换等。8cudaoptflow/CUDA-加速的光流检测算法。9cudastereo/CUDA-加速的立体视觉匹配算法。10cudawarping/实现了 CUDA-加速的快速图像变换包括透视变换、旋转、改变尺寸等。11cudaev/实现 CUDA 版本的核心功能类似 core/ 模块中的基础算法。5、OpenCV配置以及Visual Studio使用OpenCV了解了OpenCV的数据结构和功能后下面介绍OpenCV的配置win10 64 vs2022 OpenCV3.4.6步骤。1下载安装opencv 3.4.6。下载地址http://opencv.org/downloads.html。2配置环境变量计算机属性-高级系统设置-环境变量-Path-变量值 3配置vs2022 。首先打开VS2013建立一个Win32控制台项目。然后在“项目-工程属性-VC目录”中加入包含目录..\opencv\build\include;4) 加入库目录..\opencv\build\x64\vc15\lib。“项目-工程属性-链接器-输入-附加依赖”中添加附加依赖项 opencv_world346d.lib#includeopencv2\opencv.hpp using namespace cv; int main() { Mat src imread(lena.jpg); //图片必须添加到工程目录下 imshow(src , src); waitKey(); }配置完成后就可以在vs2013中使用opencv3.4.6中的函数了。6、关于Lena图片图片中的女神名叫莱娜·瑟德贝里瑞典文Lena Soderberg1951 年 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月引用了两个原因来说明莱娜图在科研领域流行的原因1首先该图片包含了平整的区块、清晰细致的纹路、渐渐变化的光影、颜色的深浅层次等细节这些都有益于测试各种不同的图像处理算法。它是一幅很好的测试照片2其次由于这是一个非常有魅力女人的照片。因此多数由男性组成图像处理研究行业倾向于使用他们认为很有吸引力的图片也并不令人惊奇。在 1997 年的第五十届 IST图像科学与技术大会上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可以用于图像处理、视频处理、机器人视觉、自动驾驶等多个领域。YOLOYou Only Look Once是一个基于深度学习的开源目标检测算法。相比传统的目标检测算法YOLO可以实现更快的检测速度在保持较高的准确率的同时可以实现实时检测。YOLO采用单个神经网络来同时预测图像中所有物体的类别和位置可以处理多种尺度和多个物体。YOLO可以用于智能监控、自动驾驶、机器人视觉等领域。因此OpenCV和YOLO都是计算机视觉领域的工具它们的应用场景和目标有所不同。OpenCV更加通用可以用于各种图像处理和计算机视觉应用而YOLO则更加专注于目标检测领域可以实现实时目标检测检测效率要高一些。9、OpenGL与DirectX的区别说到OpenCV和OpenGL的区别我们也来顺便说说OpenGL与DirectX的区别。OpenGL和DirectX都是用于渲染3D图形的API但它们有较大的区别如下1平台支持OpenGL是跨平台的API可以在几乎任何操作系统上运行而DirectX只能在Windows操作系统上运行。2API设计理念OpenGL的设计理念是简单易用允许开发人员自由选择和使用不同的实现。而DirectX更注重提供完整的解决方案包含不同的组件如Direct3D、Direct2D、DirectCompute等。3软硬件实现OpenGL可以使用多种实现方式包括软件实现和硬件加速实现。而DirectX只能使用硬件加速实现因为它是针对Windows操作系统和硬件设计的。4开发语言OpenGL是用C语言编写的API对于初学者和非专业开发人员来说学习和使用OpenGL比较困难。而DirectX是用C编写的API更易于学习和使用。5社区支持OpenGL有一个活跃的社区提供了大量的教程、资料和开源项目使开发人员更容易入门。而DirectX的社区相对较小因为它是专为Windows平台设计的。总的来说OpenGL和DirectX都有各自的优缺点在选择使用哪个API时需要考虑到项目需求、开发成本、平台支持等因素。以多媒体SDL库为例我们经常使用该库在软件中绘制视频图像当用在Windows平台上时SDL内部使用DirectX绘图当用在Linux平台上时SDL内部则使用OpenGL绘图。