OpenCV3.x中UMat介绍与使用

UMat对象起源

OpenCV3中引入了一个新的图像容器对象UMat,它跟Mat有着多数相似的功能和相同的API函数,但是代表的意义却太不一样。要说到UMat对象的来龙去脉,必须首先从OpenCL来开始说,OpenCL是一个面向异构系统通用的并行编程标准,这个标准最早是苹果公司提出,后来变成了一个国际标准,目的是通过它开发通用的GPU计算软件,中国的华为是该标准的成员之一。说的直白点就是如果CPU或者GPU支持OpenCL标准,就可以通过OpenCL相关编程实现使用GPU计算。OpenCV2.x开始支持它,不过那个时候这个功能很不好用,大致一般正常基于CPU的读写视频一帧图像代码如下:

cv::Mat inMat, outMat;vidInput >> inMat;cv::cvtColor(inMat, outMat, cv::COLOR_RGB2GRAY);vidOutput << outMat;

基于OpenCL的GPU方式读写视频一帧图像代码如下:

cv::Mat inMat, outMat;vidInput >> inMat;cv::ocl::oclMat inOclMat(inMat);cv::ocl::oclMat outOclMat;cv::ocl::cvtColor(inOclMat, outOclMat, cv::COLOR_RGB2GRAY);outMat = outOclMat;vidOutput << outMat;

而且上述代码在不支持OpenCL的平台上还会运行失败,使用起来及其不方便。对开发者来说不是统一API和底层透明。

于是OpenCV在3.0版本中开始引入了T-API(Transparent API)设计理念,即通过设计一套对开发者来说底层透明,接口统一的API调用方式,避免由于系统不支持OpenCL而导致程序运行失败,这个就是UMat图像容器类型。通过使用UMat对象,OpenCV会自动在支持OpenCL的设备上使用GPU运算,在不支持OpenCL的设备仍然使用CPU运算,这样就避免了程序运行失败,而且统一了接口。上述代码在OpenCV3中使用UMat改下如下:

cv::UMat inMat, outMat;vidInput >> inMat;cv::cvtColor(inMat, outMat, cv::COLOR_RGB2GRAY);vidOutput << outMat;

这样就无需像OpenCV2中那样通过显式声明的调用方式。很明显UMat与Mat极其类似。而且两者之间是可以相互转换的。

Mat与UMat相互转换

从UMat中获取Mat

对象使用UMat的get方法UMat::getMat(int access_flags)支持的FLAG如下:

  • ACCESS_READ
  • ACCESS_WRITE
  • ACCESS_RW
  • ACCESS_MASK
  • ACCESS_FAST

最常用的就是读写,注意当使用这种方式的时候UMat对象将会被LOCK直到CPU使用获取Mat对象完成操作,销毁临时Mat对象之后,UMat才可以再被使用。

从Mat中获取UMat

通过Mat::getUMat()之后就获取一个UMat对象,同样在UMat对象操作期间,作为父对象Mat也会被LOCK直到子对象UMat销毁之后才可以继续使用。

OpenCV的官方文档说不鼓励在一个方法和一段代码中同时使用Mat与UMat两种方式,因为这样做真的非常危险。此外Mat与UMat还可以相互拷贝,但是这种方式也不是OpenCV官方提倡与推荐的,所以尽量别用这种方式。

代码示例与演示

使用UMat读取视频并将视频每一帧转换为灰度显示

#include <opencv2/opencv.hpp>#include <opencv2/tracking.hpp>#include <iostream>using namespace cv;using namespace std;int main(int argc, char** argv) {    VideoCapture capture;    capture.open("D:/vcprojects/images/sample.mp4");    if (!capture.isOpened()) {        printf("could not load video data...\n");        return -1;    }    // UMat方式读取视频,转为灰度显示-自动启用GPU计算    // 如果显卡支持OpenCL    UMat frame, gray;    namedWindow("UMat Demo", CV_WINDOW_AUTOSIZE);    while (capture.read(frame)) {        cvtColor(frame, gray, COLOR_BGR2GRAY);        imshow("UMat Demo", gray);        char c = waitKey(100);        if (c == 27) {            break;        }    }    // 释放资源    capture.release();    waitKey(0);    return 0;}

此外小编基于OpenCV扩展模块使用UMat实现多对象跟踪跟Mat版本相比较,在本人的笔记本上明显可以看到速度得到提升。视频读取与多对象跟踪效果显示如下:

原文发布于微信公众号 - OpenCV学堂(CVSCHOOL)

原文发表时间:2017-04-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

Facebook的CherryPi团队开源星际争霸平台TorchCraftAI

2018 AIIDE StarCraft AI挑战赛顺利结束,Facebook AI Research的CherryPi团队获得亚军,现在宣布在Github上开...

26110
来自专栏数据小魔方

一篇文章教你搞定JSON素材,从此告别SHP时代~

最近几天推送频率之所以下降了,不是因为偷懒,是在攻克一个难题~ 还记得前一篇推送,关于山东省财政数据可视化那一篇,因为没有精准、最新的山东省县级市边界地图素材数...

39560
来自专栏小白课代表

2018.4.3 小白课代表的软件目录

21020
来自专栏小白课代表

有需求+小白课代表的软件目录(5.9)

30030
来自专栏吉浦迅科技

DAY81:阅读Compute Capability 5.x

When a multiprocessor is given warps to execute, it first distributes them among...

18130
来自专栏向治洪

ARKit 简介

ARKit 简介 苹果在AR一直布局VR,最近的苹果开发者大会上,果家终于放出大招:iOS移动端ARKit平台以及VR兼容新桌面操作系统macOS High S...

30160
来自专栏MixLab科技+设计实验室

全民刷军装背后的AI技术及简单实现

昨天有Design-AI-Lab用户后台留言,问为什么换军装的h5这么火,但没见到有技术文章分析如何实现。 我回复说,大概是比较简单吧,主要工作是图像合成。 ...

469100
来自专栏编程

UG数控编程“新手必看”

1.坐标详解 1. 绝对坐标系:是模型空中的概念性位置和方向,将绝对坐标系为X=0,Y=0,Z=0.不可见不能移动。 2. 视图三重轴:是在建模最左下角有个正方...

255100
来自专栏吉浦迅科技

NVIDIA Jetpack 4.0开发者预览版发布

JetPack 4.0开发者预览EA(Early Access )版是为了让开发者能够立即开始用Jetson Xavier测试他们的应用程序,而不是一个产品版本...

28440
来自专栏杨清华的专栏

JPEG 在 GPU 上压缩性能瓶颈分析

鉴于AI是当下最火的技术方向,GPU加速运算在这方面又有天然的优势,所以官方在介绍其性能差异时主要针对AI各个计算框架来展示其加速比。针对于图像压缩处理这样的场...

1.2K20

扫码关注云+社区

领取腾讯云代金券