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 ...
随机推荐
- 当通过Struts2传值给后台时,如果是外键,传字符串那么会出现错误
当通过Struts2传值给后台时,如果是外键,传字符串那么会出现错误 如<input type="text" name="user.department" ...
- JAVA将byte数组(byte[])按照指定大小分割成多个byte数组
/** * 将byte数组按照指定大小分割成多个数组 * @param bytes 要分割的byte数组 * @param subSize 分割的块大小 单位:字节 * @return 指定大小的by ...
- SpringBoot 自定义注解
新增注解类 NotRepeatSubmit.java package com.example.demo.annotation; import java.lang.annotation.ElementT ...
- 【LeetCode】1399. 统计最大组的数目 Count Largest Group
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接求 日期 题目地址:https://leetcod ...
- Android 控件使用教程(三)—— NineGridImageView 九宫格展示图片
引子 上文降到RecyclerView的使用,确实非常方便易用,而且样式多样,很灵活.但在图像展示时,经常有朋友圈和微博等9张图以内的图片展示需求,这时候,不是一个可以无限下滑的RecyclerVew ...
- codeforces(Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) )(C,D)
C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...
- c#16进制转浮点数单精度类型
c#16进制转浮点数单精度类型: string s = "4144147B"; MatchCollection matches = Regex.Matches(s, @" ...
- BL8810|USB 2.0单芯片解决方案闪存读卡器|BL8810替代GL823K
创惟GL823K是一款USB 2.0单LUN读卡器控制器,可支持SD/MMC/MSPRO闪存卡.它支持USB 2.0高速传输,将Digital TM(SD).SDHC.SDXC.Mini DTM.Mi ...
- <数据结构>图的最小生成树
目录 最小生成树问题 Prim算法:点贪心 基本思想:类Dijstra 伪代码 代码实现 复杂度分析:O(VlogV + E) kruskal算法:边贪心 基本思想: 充分利用MST性质 伪代码 代码 ...
- 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长、宽、高分别为 8 米、5 米、3 米
查看本章节 查看作业目录 需求说明: 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长.宽.高分别为 8 米.5 米.3 米 实现思路: 创建 HTML 页面 在页面的 < ...