前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV3.x中UMat介绍与使用

OpenCV3.x中UMat介绍与使用

作者头像
OpenCV学堂
发布2018-04-04 10:57:34
4.9K0
发布2018-04-04 10:57:34
举报
文章被收录于专栏:贾志刚-OpenCV学堂
UMat对象起源

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

代码语言:javascript
复制
cv::Mat inMat, outMat;vidInput >> inMat;cv::cvtColor(inMat, outMat, cv::COLOR_RGB2GRAY);vidOutput << outMat;

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

代码语言:javascript
复制
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改下如下:

代码语言:javascript
复制
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读取视频并将视频每一帧转换为灰度显示

代码语言:javascript
复制
#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版本相比较,在本人的笔记本上明显可以看到速度得到提升。视频读取与多对象跟踪效果显示如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mat与UMat相互转换
    • 从UMat中获取Mat
      • 从Mat中获取UMat
      • 代码示例与演示
      相关产品与服务
      图像处理
      图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档