OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库(主要操作对象是图像)。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的应用程序接口(API)的规格,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟实境、科学可视化程序和电子游戏开发
两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取信息,是用机器来理解图像;后者是用机器绘制合适的视觉图像给人看
OpenCV 与 OpenGL 的关系是什么?
如果读者留意 OpenCV 2.3 之后的版本,那么会发现 cv::ogl namespace,ogl 自然是 OpenGL了。一个三维计算机图形库为何出现在计算机视觉中,传统的 CV 开发者是否需要学习它,这些问题待我一一来回答。
问题一:为何引入 OpenGL?
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 来实现的,不论是画线还是把图片显示到屏幕上。这有两个问题,速度慢,同时没法画三维物体。引入 OpenGL 是为了借助 显卡的力量,显卡比 CPU 更擅长渲染,同时显卡和 CPU 可以同时干活。比方说,CPU 在获取摄像头画面然后检测人脸时,显卡在渲染三维的人脸网格模型和高精度抗锯齿的二维界面。
另外,随着民用深度传感器的普及,cv::VideoCapture 第一时间增加了对 Kinect、华硕 Xtion、Intel Perceptual Computing SDK 等的支持。传统的视觉计算中,深度图只能当做单通道的灰度图进行处理。想实现隔空的多点触摸是绰绰有余,但是如果想实现三维重建(比如 Kinect Fushion)那么我们必须将算法升级到三维空间。相应的,三维空间的算法也需要三维的 API 进行渲染,也就是 OpenGL。
想开启该功能,需要在配置 CMake 时选上 WITH_OPENGL=ON,然后重新编译完整的 OpenCV 库。我简要介绍下几个组件:
ogl::Buffer 是 OpenGL 中的缓存区,可以用于保存多边形的顶点和颜色等。
ogl::Texture2D 是保存在显卡中的二维贴图,可以认为是得到 GPU 加速的 cv::Mat。
前面这两个类都只是保存数据,要把数据画出来,还要用到 ogl::render 函数。
oid ogl::render(const Texture2D& tex, Rect_《double》 wndRect=Rect_《double》(0.0, 0.0, 1.0, 1.0), Rect_《double》 texRect=Rect_《double》(0.0, 0.0, 1.0, 1.0))
问题二:是否应该学习 OpenGL?
It depends.
如果你开发的是命令行程序并不显示任何图像,或者显示的图片很简单,那么不需要转换到 cv::ogl 下。
如果你的应用耗费了大量时间在图片的显示上,或是希望拥有高质量的界面系统,那么你可以借助 cv::ogl::Texture2D 加速图像的渲染。
如果你开发的是增强现实应用,你肯定已经拥有了自己的三维渲染模块,可以考虑与 cv::ogl::Buffer 整合。
如果你已经在使用 CUDA 模块,对于渲染的时候数据需要回传到 CPU 表示多此一举,那么你可以使用 CUDA 与 OpenGL 的协同功能去除多余的数据传输。
另一方面,如果你不是 OpenCV 的用户但是你正在开发虚拟现实应用,你可以考虑将视觉计算引入到你的系统中,实现类似 HoloLens 的设备。
未来展望:OpenCV 与显卡的关系
由于显卡能力的增强以及硬件公司的支持,OpenCV 逐渐展露出新的形态,大量的视觉计算位于显卡上。
运算通过 CUDA 模块或 OpenCL 模块,这两个模块分别得到 NVIDIA 与 AMD 的大力支持。
渲染通过 OpenGL 模块。
这意味着除了文件读写(highgui 模块)外,视觉应用可以逐渐脱离 CPU。
opencv和opengl哪个更有前途?
OpenGL
OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的威廉希尔官方网站 很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色威廉希尔官方网站 的扩展功能。
OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如图一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。
目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫。
为什么存在OpenCV
计算机视觉市场巨大而且持续增长,且这方面没有标准API,目前的计算机视觉软件大概有以下三种:
1) 研究代码(慢,不稳定,独立并与其他库不兼容)
2) 耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3) 依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)
这是目前的现状。而标准的API将简化计算机视觉程序和解决方案的开发。OpenCV致力于成为这样的标准API。
2、 项目历史
1999年1月,CVL项目启动。主要目标是人机界面,能被UI调用的实时计算机视觉库,为Intel处理器做了特定优化。
2000年6月,第一个开源版本OpenCV alpha 3发布。
2000年12月,针对linux平台的OpenCV beta 1发布。
期间,继续各种研究。。。
2006年,支持Mac OS的OpenCV 1.0发布。
2009年9月,OpenCV1.2(beta2.0)发布。
2009年10月1日,Version 2.0发布。
OpenCV 拥有包括 500 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也可以使用某些外部库。
OpenCV 使用类BSDlisence,所以对非商业应用和商业应用都是免费(FREE)的。(细节参考 license)。
OpenCV 为Intel Integrated Performance Primitives (IPP) 提供了透明接口。 这意味着如果有为特定处理器优化的的IPP 库, OpenCV 将在运行时自动加载这些库。
OpenCV提供的视觉处理算法非常丰富,并且他不分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和单片机系统中,目前这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。
OpenCV学术气息太强,功能虽多,但针对特定功能的优化不足,适合创建原型,不适合开发产品,所以也没什么前途——当然总比死掉的OpenGL有前途。
评论
查看更多