OpenCV 为啥勾搭上 OpenGL

OpenCV 为啥勾搭上 OpenGL?

Vinjn张静· 2 年前

如果读者留意 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 函数。

void 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。

---------------------------------

时间: 03-29

OpenCV 为啥勾搭上 OpenGL的相关文章

openCV在ubuntu上的使用(0)

首先是两个安装的链接: http://www.tuicool.com/articles/nYJrYra http://my.oschina.net/u/1757926/blog/293976我使用的是ubuntu14.04版本,64位的.在sourceforge上下载的压缩文件,最新的版本按照上面的实例无法安装.我这边装了个较就的版本,2.4.8版本,临时还算够用.同时,也可以在github上面下载最新版本的源代码,同样的进行编译安装.https://github.com/上面搜索openCV,

OpenCV在矩阵上的卷积

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 OpenCV在矩阵上的卷积 在openCV官网上说是戴面具,事实上就是又一次计算一下矩阵中的每个value,那么怎么计算呢,依据该像素点的周围信息,用一个加权的公式来进行计算.那么如今就要看,周围的信息是怎样被加权的.让我们想一下这种方式,请看以下的公式: 上面的公式就是根据当前像素点的值和四个邻居的值,更新一下.相当于原来矩阵每一块3*3的小矩阵和M进行想乘一样. 在程序中,我们对该公式进行编程的话,会是

opencv在图片上添加文字

/****************************************** func:cvText desc:put text on an image @param img The image pointer which we want to put text on @param text the text pointer @param x the x coordinate @param y the y coordinate @return null ****************

用 Python 和 OpenCV 检测图片上的条形码

  用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需要留意的是,这个算法并不是对所有条形码有效,但会给你基本的关于应用什么类型的技术的直觉. 假设我们要检测下图中的条形码: 图1:包含条形码的示例图片 现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编

Linux系统下的OpenCV编译以及OpenCV的Qt上的使用

背景: Ubuntu 15.04 Qt 5.2.1 OpenCV 3.0.0 资料全部来源于网络,我只是资料的搬运工. 首先,我们应该安装几个必要的东西 sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev libavformat-dev libswscale-dev 这里,我感觉有一些python相关的,不用安装(我这里使用的是c++)

基于暗通道去雾算法的实现与优化(二)opencv在pc上的实现

上一篇中,学习了何的论文中的去雾方法,这一篇中,我按照何的论文思路借助opencv 2.4.10 进行了实现,效果的确很好,就是耗时太多了,效果见下图:蓝色圆圈代表大气光值的取值点. 突然发现上一篇中忘了介绍大气光值A的求解了,论文中是这样做的: 1.首先取暗通道图中最亮的千分之一的像素点. 2.根据这些像素点的位置在原图中搜索一个最亮的点,这个点的强度(intensity)就是我们要求的A啦. 论文作者何认为这样做的好处就是避免了原图中比较亮的物体作为A的值,比如图片中的白色的汽车,如果从原图

opencv在hisi上的移植总结

经本人尝试opencv249在arm-hisiv200-linux-g++ 可以编译通过,在arm-hisiv100-linux-g++ 下编译会出现错误.本文分别介绍在arm-hisiv200-linux-g++ 和arm-hisiv100-linux-g++ 下opencv的编译方式. 一.arm-hisiv200-linux-g++交叉编译链 Ubuntu12.04 OpenCV-2.4.9 1.在/home下新建文件夹 # mkdir opencv249 把下载的OpenCV-2.4.9

利用jsoncpp+curl+opencv从服务器上解析到下载到显示图片

#include<iostream> #include<fstream> #include"json.h" #include "opencv2/opencv.hpp" using namespace cv; using namespace std; void get_json_txt() { system("curl \"http://192.168.8.3:3000/getPhotoWallLogin?user=stev

安装opencv在MacOS上

1. 使用brew安装opencv brew tap homebrew/science brew install opencv ls /Users/mac/Library/Python/2.7/lib/python/site-packages mkdir -p /Users/mac/Library/Python/2.7/lib/python/site-packages sudo mkdir -p /Users/mac/Library/Python/2.7/lib/python/site-pack