OpenCV、OpenGL、OpenCL和DirectX的区别、联系、前景致敬:
1概念⽐较
=  Open Source Computer Vision Library
= Open Graphics Library
= Open Computing Language
DirectX = DirectX  ^_^
OpenCV主要是提供图像处理和视频处理的基础算法库,还涉及⼀些机器学习的算法。⽐如你想实现视频的降噪、运动物体的跟踪、⽬标(⽐如⼈脸)的识别这些都是CV的领域
OpenGL(或DirectX)是什么呢?是负责3D图形处理的API,包括各种光照、纹理、烟雾、阴影等效果。程序员在开发游戏的时候,只要考虑什么时候、在哪个位置,加上什么样的烟雾,就可以了。⽽不必考虑究竟要怎样去编写代码,才能实现烟雾效果的问题。
OpenCL呢?是显卡作通⽤浮点运算的API。⽐如视频转码,原来这个⼯作都是CPU来做的。现在显卡运
算能⼒⽐较强,这个⼯作完全可以交给显卡来做。那究竟怎样调⽤显卡呢?这个⼯作不需要再由程序员考虑了,因为已经有⼀个现成的接⼝了,程序员只要管好转码的算法,然后直接调⽤OpenCL中现成的指令,这个⼯作就⾃动由CPU转交到GPU了。
DirectX 特点:
1)除视频外,多了⾳频等其他功能。
2)DirectX通⽤些,OpenGL专业些。
3)仅⽤于Microsoft Windows
4)DirectX是左⼿定则,OpenGL是右⼿定则
Dx是微软做的⼀个超⼤的多媒体处理合集,包括⾳频,视频,direct3D只是其中之⼀
Dx做的⾳视频的采集和显⽰部分,算法涉及不多
Dx做的事都是和硬件有关系的,都要依赖硬件的,由于ms的强⼤,现在硬件⼤都⽀持dx
dx显⽰视频的时候没有通过gdi,是直接通过显卡实现的,⾮常的快。
后⾯主要⽐较OpenCV和OpenGL
通俗的说: OpenCV:不知道实际空间,但是有图像,⽤来处理图像并把图像⾥⾯包含的空间信息提取出来。这是图像处理⼯作⽤的软件。 OpenGL:知道实际空间参数,要在计算机上把这个空间表达出来。这是计算机图形学的东西。 ⼀个画家写⽣,看风景就需要OpenCV。。。素描就需要OpenGL。。。
学术的说:
两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取信息,是⽤机器来理解图像;后者是⽤机器绘制合适的视觉图像给⼈看
对象类型:
OpenCV:图像
OpenGL:图形
2功能⽐较
各⾃功能
功能opencv opengl
对2D的⽀持主要2D,主要3D,专注在Graphics,也⽀持2D
对3D的⽀持⼀定程度⽀持3D。传统的视觉
计算中,深度图只能当做单通
道的灰度图进⾏处理。想实现
隔空的多点触摸是绰绰有余,
但是如果想实现三维重建(⽐
如 Kinect Fushion)那么我
们必须将算法升级到三维空
间。相应的,三维空间的算法
也需要三维的 API 进⾏渲染,
也就是 OpenGL
很专业
主要函数图像处理:降噪、运动物体跟
踪、⽬标(⽐如⼈脸)识别、
车道线识别
渲染
函数个数500个左右?350个左右?
操作系统Windows,Linux Windows,Linux 硬件CPU,通过扩展也⽀持GPU GPU,也⽀持CPU 同⾏软件DirectX 3D
输⼊类型是图像处理库,⼀般针对真实
图像,⽐如摄像头、照相机获
取的视频图像,标准化的图形
数据(如JPEG, PNG, BMP)
更多的⽤于CAD、科学可视化
程序,⽐如游戏,虚拟现实,
输⼊点、线等
开发语⾔基于C基于C
开源是是
对点云的⽀持⼀般结合PCL库或OpenGL⽀持
相互关系:
增强现实(AR)应⽤中,既可能⽤到OpenCV,也可能⽤到OpenGL
由于显卡的能⼒增强,现在的 OpenCV 已经有新的形态了,即⼤量的运算位于显卡上。
运算通过 CUDA(显卡⼚商NVIDIA推出的运算平台) 或 OpenCL。
渲染仍然需要通过 OpenGL
这意味着除了⽂件读写(highgui 模块)外,视觉应⽤可以逐渐脱离 CPU。
3历史⽐较
⼀、      OpenGL
OpenGL(全写Open Graphics Library)是个定义了⼀个跨编程语⾔、跨平台的编程接⼝的规格,它⽤于三维图像(⼆维的亦可)。OpenGL是个专业的图形程序接⼝,是⼀个功能强⼤,调⽤⽅便的底层图形库。
没有OpenGL的时候,应⽤软件是这样开发的:
硬件A--硬件驱动A--应⽤软件A
硬件B--硬件驱动B--应⽤软件B
硬件C--硬件驱动C--应⽤软件C
有了OpenGL之后,应⽤软件是这样开发的:
硬件A--硬件驱动A--OpenGL--应⽤软件A
硬件B--硬件驱动B--OpenGL--应⽤软件A
硬件C--硬件驱动C--OpenGL--应⽤软件A
渲染概述:
OpenGL 中存在着⼀个三维坐标系,三个坐标满⾜右⼿定则。它的成像原 理就是将三维世界的物体和场景投影到⼆维平⾯。可以把它看成⼀个相机系统, OpenGL 调⽤者来说,只需要提供相机的位置和指向的⽅向,物体的位置,我 们得到相⽚后还可以对某⼀部分进⾏裁剪放⼤和缩⼩,然后摆放在相框中,这样 照相过程就完成了,这⼏个过程也是 OpenGL 成像的过程,分别对应 OpenGL 的 ⼏个变换,视⼝变换,投影变换,位移变换,视点变换。程序中应该依次调⽤这 ⼏个变换的 api,才能正确地完成渲染。但是实际上在运算时这⼏个变换的顺序 却是相反的。⾸先是视点变换,它确定了相机的位置朝向和正⽅向,然后是位移变换,这⾥包括平移和旋转,即计算出物体在世界坐标系中的位置。投影变换是三维世界投影到⼆维平⾯的过程。最后⼀个视⼝变换,是决定⽣成的图像如何在窗⼝上显⽰的过程。
1、 概述
OpenGL - ⾼性能图形算法⾏业标准
OpenGL™ 是⾏业领域中最为⼴泛接纳的 2D/3D 图形 API, 其⾃诞⽣⾄今已催⽣了各种计算机平台及设备上的数千优秀应⽤程序。OpenGL™ 是独⽴于视窗操作系统或其它操作系统的,亦是⽹络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等⾏业领域中,OpenGL™ 帮助程序员实现在 PC、⼯作站、超级计算机等硬件设备上的⾼性能、极具冲击⼒的⾼视觉表现⼒图形处理软件的开发。
OpenGL的前⾝是SGI公司为其图形⼯作站开发的IRIS GL。IRIS GL是⼀个⼯业标准的3D图形软件接⼝,功能虽然强⼤但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英⽂全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接⼝”。虽然DirectX在家⽤市场全⾯领先,但在专业⾼端绘图领域,OpenGL是不能被取代的主⾓。
OpenGL是个与硬件⽆关的软件接⼝,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进⾏移植。因此,⽀持OpenGL的软件具有很好的移植性,可以获得⾮常⼴泛的应⽤。由于OpenGL是图形的底层图形库,没有提供⼏何实体图元,不能直接⽤以描述场景。但是,通过⼀些转换程序,可以很⽅便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和
3DS模型⽂件转换成OpenGL的顶点数组。
在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种⾼级图形库,适应不同应⽤。其中,Open Inventor应⽤最为⼴泛。该软件是基于OpenGL⾯向对象的⼯具包,提供创建交互式3D图形应⽤程序的对象和⽅法,提供了预定义的对象和⽤于交互的事件处理模块,创建和编辑3D场景的⾼级应⽤程序单元,有打印对象和⽤其它图形格式交换数据的能⼒。
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发展前景迷茫。
2、 OpenGL的发展历程
1992年7⽉,SGI公司发布了OpenGL的1.0版本,随后⼜与微软公司共同开发了Windows NT版本的OpenGL,从⽽使⼀些原来必须在⾼档图形⼯作站上运⾏的⼤型3D图形处理软件也可以在微机上运⽤。
  1995年OpenGL的1.1版本⾯市,该版本较1.0性能提⾼许多,并加⼊了⼀些新的功能。包括提⾼顶点位置、法线、颜⾊、⾊彩指数、纹理坐标、多边形边缘标识的传输速度,引⼊了新的纹理特性等等。
  1997年,Windows 95下3D游戏的⼤量涌现,游戏开发公司迫切需要⼀个功能强⼤、兼容性好的3D图形接⼝,⽽当时微软公司⾃⼰的3D图形接⼝DirectX 3.0功能却是很糟糕。因⽽以制作《雷神之锤》
等经典3D射击游戏⽽著名的id公司同其它⼀些游戏开发公司⼀同强烈要求微软在Windows 95中加⼊对OpenGL的⽀持。微软公司最终在Windows 95的OSR2版和后来的Windows 版本中加⼊了对OpenGL的⽀持。这样,不但许多⽀持OpenGL的电脑3D游戏得到⼴泛应⽤,⽽且许多在3D图形设计软件也可以运⽤⽀持OpenGL标准的3D加速卡,⼤⼤提⾼其3D图形的处理速度。
  2003年的7⽉28⽇,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式扩展规格绘制语⾔“OpenGL Shading Language”。OpenGL 1.5的新功包括:顶点Buffer Object、Shadow功能、隐蔽查询、⾮乘⽅纹理等。
  2004年8⽉,OpenGL2.0版本发布~OpenGL 2.0标准的主要制订者并⾮原来的SGI,⽽是逐渐在ARB中占据主动地位的3Dlabs。opengl2.0⽀持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。
  2008年8⽉初Khronos⼯作组在Siggraph 2008⼤会上宣布了OpenGL 3.0图形接⼝规范,GLSL1.30 shader语⾔和其他新增功能将再次未来开放3D接⼝发展指明⽅向。
  OpenGL 3.0 API开发代号为Longs Peak,和以往⼀样,OpenGL 3.0仍然作为⼀个开放性和跨平台的3D图形接⼝标准,在Shader 语⾔盛⾏的今天,OGL3.0增加了新版本的shader语⾔:GLSL 1.30,可以充分发挥当前可编程图形硬件的潜能。同时,OGL3.0还引⼊了⼀些新的功能,例如顶点矩阵对象,
全帧缓存对象功能,32bit浮点纹理和渲染缓存,基于阻塞队列的条件渲染,紧凑⾏半浮点顶点和像素数据,四个新压缩机制等等。
  2009年3⽉⼜公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。OpenGL 3.1将此前引⼊的OpenGL着⾊语⾔“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更⾼效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0版的基础上对整个API模型体系进⾏了简化,可⼤幅提⾼软件开发效率。
2009年8⽉Khronos⼩组发布了OpenGL 3.2,这是⼀年以来OpenGL进⾏的第三次重要升级。该版本仍然延续了OpenGL发展的⽅向让图形程序开发者能在多种操作系统和平台下更好的利⽤新的GPU功能。OpenGL3.2版本提升了性能表现、改进了视觉质量、提⾼了⼏何图形处理速度,⽽且使Direct3D程序更容易移植为OpenGL。除OpenGL之外,Khronos还将其开发的其它标准进⾏了协调改进,以求可以在更⼴泛的领域提供强⼤的图形功能和计算⽣态系统,这些标准包括⽤于并⾏计算的OpenCL、⽤于移动3D图形开发的OpenGL ES和⽤于⽹络3D开发的WebGL。
最有前途的编程语言Khronos旗下的OpenGL ARB(Architecture Review Board)⼯作组推出了GLSL 1.5OpenGLShading Language(OpenGL着⾊语⾔)的升级版,以及在OpenGL3.2框架下推出了两个新功能,可以让开发者在开发新程序时能够在使⽤流⽔线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版OpenGL之间的兼容性。
3、 OpenGL特点及功能
OpenGL是⼀个开放的三维图形软件包,它独⽴于窗⼝系统和操作系统,以它为基础开发的应⽤程序可以⼗分⽅便地在各种平台间移植;OpenGL可以与Visual C++紧密接⼝,便于实现机械⼿的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使⽤简便,效率⾼。它具有七⼤功能:
1)    建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多⾯体、茶壶等)以及复杂曲线和曲⾯绘制函数。
2)    变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变⽐镜像四种变换,投影变换有平⾏投影(⼜称正射投影)和透视投 影两种变换。其变换⽅法有利于减少算法的运⾏时间,提⾼三维图形的显⽰速度。
3)    颜⾊模式设置:OpenGL颜⾊模式有两种,即RGBA模式和颜⾊索引(Color Index)。
4)    光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜⾯光(Specular Light)。材质是⽤光反射率来表⽰。场景(Scene)中物体最终反映到⼈眼的颜⾊是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜⾊。
5)    纹理映射(Texture Mapping)。利⽤OpenGL纹理映射功能可以⼗分逼真地表达物体表⾯细节。
6)    位图显⽰和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反⾛样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显⽰的效果。
7)    双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简⾔之,后台缓存计算场景、⽣成画⾯,前台缓存显⽰后台缓存已画好的画⾯。
此外,利⽤OpenGL还能实现深度暗⽰(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从⽽实现了消隐算法。
4、 Open GL现状
Open GL仍然是唯⼀能够取代微软对3D图形技术的完全控制的API。它仍然具有⼀定的⽣命⼒,但是Silicon Graphics已经不再以任何让微软不悦的⽅式推⼴Open GL,因⽽它存在较⾼的风险。游戏开发⼈员是⼀个有着独⽴思想的体,很多重要的开发⼈员⽬前仍然在使⽤Open GL。因此,硬件开发商正在设法加强对它的⽀持。Direct3D⽬前还不能⽀持⾼端的图形设备和专业应⽤; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项⽬)⼀直致⼒于为任何类型的计算机(⽆论它们是否使⽤微软的操作系统)提供Open GL⽀持。
08年8⽉正式公布OpenGL3.0版本。并且得到了,nv的⽀持,其官⽅⽹站上提供针对N卡的sdk下载。
⽬前,国内的三维游戏开发技术正处于赶超国外的关键时期,从创意、策划、研究开发与实现,到游戏的运营与维护,都有⼤量的知识值得学习和摸索。由于 Linux 操作系统平台的⼤⼒推⼴,基于Linux 的各种应⽤软件也不断壮⼤,因此基于跨平台图形库的跨平台三维游戏开发也越来越受重视。OpenGL(open graphics library)是⼀种独⽴的平台⽆关的三维图形开发库,在各种语⾔下进⾏主框架开发并结合应⽤OpenGL 函数都可以开发出三维游戏。但是由于框架开发的平台相关性使游戏⽆法跨平台编译运⾏,因此glut+OpenGL 的⽅式成了⼀种很好的选择。但是在对复杂框架和各种媒体的⽀持⽅⾯,glut 并不理想。在Linux 下可以采⽤FLTK 等框架平台技术实现包括按钮在内的⽐较复杂的框架功能,但是需要专门的Linux 开发环境,众多的Window 环境下的KDE 爱好者明显对此⽆法适从。相反,SDL(Simple DirectMedia Layer)作为免费的跨平台多媒体应⽤编程接⼝,已经被⼈们⼴泛⽤于开发⼆维游戏,其优秀的消息框架⽀持、⽂件⽀持和声⾳⽀持等都使得它成为能与微软DirectX 匹敌的最为成熟的技术之⼀。
5、 OpenGL 3.1规范
Khronos Group在2009年3⽉⼜公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。
OpenGL 3.1将此前引⼊的OpenGL着⾊语⾔“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对
最新可编程图形硬件的访问,还有更⾼效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0版的基础上对整个API模型体系进⾏了简化,可⼤幅提⾼软件开发效率。
OpenGL 3.1主要新特性:Texture Buffer Objects(纹理缓冲对象)、Uniform Buffer Objects(统⼀缓冲对象)、Signed Normalized Textures(符号正常化纹理)、Primitive Restart(基本元素重启)、Instancing(实例化)、CopyBuffer API(拷贝缓冲接⼝)……
与OpenGL 3.1规范同步,OpenGL架构评审委员会(ARB)也发布了⼀个兼容性扩展,能让开发⼈员在访问OpenGL 3.1⾥已经删除的OpenGL 1.x/2.x功能,确保应⽤程序的全⾯向下兼容性。
OpenGL 3.1公布后,业界图形⼚商很快予以了⼤⼒⽀持。AMD OpenGL主管Suki Samra表⽰:“AMD全⾯⽤户OpenGL API,会在今后的Radeon和FirePro产品驱动程序中⽀持OpenGL 3.1。”NVIDIA市场营销副总裁Dan Vivoli表⽰:“NVIDIA承诺尽快部署OpenGL 3.1,我们也很⾃豪地在规范公布同⼀天放出了⾃⼰的测试版驱动程序。”
市场调研机构Jon Peddie Research预测,OpenGL 3.1规范图形硬件的安装规模将超过1亿。AMD、NVIDIA、S3 Graphics的显卡驱动⽬前都已经⽀持OpenGL 3.0。
6、 OpenGL与DirectX的区别
OpenGL 只是图形函数库。
DirectX 包含图形, 声⾳, 输⼊, ⽹络等模块。
OpenGL稳定,可跨平台使⽤。DirectX仅能⽤于Windows系列平台,包括Windows Mobile/CE系列以及XBOX/XBOX360。
⼆、      OpenCV
1、 为什么存在OpenCV
计算机视觉市场巨⼤⽽且持续增长,且这⽅⾯没有标准API,⽬前的计算机视觉软件⼤概有以下三种:
1)    研究代码(慢,不稳定,独⽴并与其他库不兼容)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。