linux + opencv + cuvid中使用cv::cuda::GpuMat类的一些坑
1.我最终成功实现了opencv中利用cuvid实现GPU视频解码:
核心代码是:
1 cv::cuda::GpuMat d_frame;
2 cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(mp4_file_name);
3 for (;;)
4 {
5 if (!d_reader->nextFrame(d_frame)) //BRGA格式
6 break;
7 gpu_frame_count++;
8 cv::Mat frame2;
9 d_frame.download(frame2);
10 cv::imwrite("xxx.png", frame2);
11 }
2.GupMat类的参考地址是:
https://docs.opencv.org/master/d0/d60/classcv_1_1cuda_1_1GpuMat.html
源码在: opencv-master/modules/core/include/opencv2/core/cuda.hpp
GPUMat类的成员变量都是public的,就算没有提供访问的方法也没关系。
一些重要的成员变量和成员函数是:
1 class CV_EXPORTS_W GpuMat
2 {
3 public:
4
5 /** @brief Performs data download from GpuMat (Blocking call)
6
7 This function copies data from device memory to host memory. As being a blocking call, it is
8 guaranteed that the copy operation is finished when this function returns.
9 */
10 CV_WRAP void download(OutputArray dst) const;
11
12 /** @brief Performs data download from GpuMat (Non-Blocking call)
13
14 This function copies data from device memory to host memory. As being a non-blocking call, this
15 function may return even if the copy operation is not finished.
16
17 The copy operation may be overlapped with operations in other non-default streams if \p stream is
18 not the default stream and \p dst is HostMem allocated with HostMem::PAGE_LOCKED option.
19 */
20 CV_WRAP void download(OutputArray dst, Stream& stream) const;
21
22 //! the number of rows and columns
23 int rows, cols;
24
25 //! a distance between successive rows in bytes; includes the gap if any
26 CV_PROP size_t step;
27
28 //! pointer to the data
29 uchar* data;
30
31 //! helper fields used in locateROI and adjustROI
32 uchar* datastart;
33 const uchar* dataend;
34
35 };
data是GPU内存中,存储图像数据的指针
datastart的地址与data相同
dataend指向图像存储空间的结束位置。(很可惜,这里是错误的)
rows 是图片的高度
cols是图片的宽度
channels() 返回4, 说明每个像素是四个字节,格式是BGRA
step是图片每行的字节数。注意:这个值是按2的幂对齐的。我测试中使用的图片,宽度是480,每像素四字节的话,一行应该是1920; 而此处的step值是2048, 每行多出来32像素,这些像素的alpha通道值为0。
因此,虽然看起来dataend-datastart是GPU内存所占空间大小,但实际的所占空间是:step*rows
3. GpuMat类使用dowmload()方法后,Mat类会去掉多余的对齐的像素
具体怎么做到的呢?搜索了很久终于找到源码原来在:opencv-master/modules/core/src/cuda/gpu_mat.cu
download方法的源码是:
1 void cv::cuda::GpuMat::download(OutputArray _dst) const
2 {
3 CV_DbgAssert( !empty() );
4
5 _dst.create(size(), type());
6 Mat dst = _dst.getMat();
7
8 CV_CUDEV_SAFE_CALL( cudaMemcpy2D(dst.data, dst.step, data, step, cols * elemSize(), rows, cudaMemcpyDeviceToHost) );
9 }
直接这样拷贝也是可以的:
cudaMemcpy(host_data, d_frame.data, d_frame.rows * d_frame.step , cudaMemcpyDeviceToHost);
但要注意:
#include <cuda_runtime.h>
cudaGetDeviceCount(&num_devices);
cudaSetDevice(cuda_device);
//调用各种函数来初始化cuda运行环境,否则一执行就崩溃
linux + opencv + cuvid中使用cv::cuda::GpuMat类的一些坑的更多相关文章
- 【记录一个问题】linux+opencv+cuvid解码1080P视频,当使用CUDA核函数的时候,必然崩溃
崩溃的信息如下: 1 OpenCV(4.1.0-dev) Error: Gpu API call (invalid configuration argument) in videoDecPostPro ...
- 【记录一个问题】cv::cuda::BufferPool发生assert错误
cv::cuda::setBufferPoolUsage(true); const int width = 512; const int height = 848; const int channel ...
- 【小记录】cv::cuda::Stream中取出cudaStream_t并用于核函数的计算
以下是找到的代码 1 cv::cuda::Stream stream; 2 cudaStream_t s = cv::cuda::StreamAccessor::getStream(stream); ...
- 【记录一个问题】linux + opencv + gpu视频解码,好不容易编译通过,运行又coredump了
1.首先编译了opencv + cuda 编译选项中使用了以下关于cuvid库的内容: //"nvcuvid" libraryCUDA_nvcuvid_LIBRARY:FILE ...
- Opencv undefined reference to `cv::imread() Ubuntu编译
Ubuntu下编译一个C++文件,C++源程序中使用了opencv,opencv的安装没有问题,但是在编译的过程中出现如下错误: undefined reference to `cv::imread( ...
- OpenCV图像处理中的“机器学习"技术的使用
注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景 相比较当下发展迅速的各路"端到端" ...
- 【视频解码性能对比】opencv + cuvid + gpu vs. ffmpeg + cpu
视频大小:1168856 字节画面尺寸:480*848帧数:275opencv + cuvid + tesla P4, 解码性能:1426.84 fps ffmpeg 4.0 API + [Intel ...
- 【记录一个问题】cv::cuda::dft()比cv::dft()慢很多
具体的profile调用图如下: 可以看见compute很快,但是构造函数很慢. nvidia官网看到几篇类似的帖子,但是没有讲明白怎么解决的: opencv上的参考文档:https://docs.o ...
- 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(3)
作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...
随机推荐
- MyBatis学习(二)MyBatis-Statement方式的增删改查
1.前期准备 项目骨架图如下所示 1.配置conf.xml <?xml version="1.0" encoding="UTF-8" ?> < ...
- SpringBoot整合Netty实现socket通讯简单demo
依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifa ...
- VS2010 sp1离线下载地址和在线下载地址
地址是:http://www.msdn1.cn/8/42/ 下载: edk2 + 迅雷, 稳的1P
- 【九度OJ】题目1107:搬水果 解题报告
[九度OJ]题目1107:搬水果 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1107 题目描述: 在一个果园里,小明已经将所有的水 ...
- 【机器学习】决策树(Decision Tree) 学习笔记
[机器学习]决策树(decision tree) 学习笔记 标签(空格分隔): 机器学习 决策树简介 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个 ...
- 【LeetCode】732. My Calendar III解题报告
[LeetCode]732. My Calendar III解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/my-calendar ...
- 【LeetCode】877. Stone Game 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 双函数 单函数 + 记忆化递归 动态规划 日期 ...
- 【LeetCode】807. Max Increase to Keep City Skyline 解题报告(Python &C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- CNN、RNN
卷积神经网络有三个结构上的特性:局部连接,权重共享以及空间或时间上的次采样.这些特性使得卷积神经网络具有一定程度上的平移.缩放和扭曲不变性. CNN由可学习权重和偏置的神经元组成.每个神经元接收多个输 ...
- 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法
第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...