c++ - C++:从 GPU 内存 (cudaMemcpy2D) 获取 BGR 图像 (cv::Mat)
问题描述
我正在研究图像处理并使用 OpenCV 为 RGB 和单色相机开发相机包装器。现在我必须使用与 CUDA 配合使用的现有算法来处理这两个相机图像流。为此,我必须将 Mat 图像复制到我的设备(该算法不使用 gpumat)。我cv::Mat::ptr
用来访问图像的数据。当我使用cudaMemcpy2D
将图像返回给主机时,我收到了 RGB 图像的暗图像(仅零)。即使我cudaMemcpy2D
过去只是将它加载到设备并在下一步中将其带回cudaMemcpy2D
它也不起作用(我的意思是我不会在两者之间进行任何图像处理)。但它适用于单声道图像:
width = 1920; (image dimensions are the same for mono and BGR)
height = 1080;
Mat mat_mono(height, width, CV_8UC1);
Mat mat_mono_disp(height, width, CV_8UC1);
size_t pitch_mono;
uint8_t* image_mono_gpu,
size_t matrixLenMono = width;
cudaMallocPitch(&image_mono_gpu, &pitch_mono, width, height);
mat_mono = MonoCamera.CaptureMat(1); // wrapper for the mono camera that grabs the image
// copy to device
cudaMemcpy2D(image_mono_gpu, pitch_mono, mat_mono.ptr(), width, matrixLenMono, height, cudaMemcpyHostToDevice);
// copy back to host
cudaMemcpy2D(mat_mono_disp.ptr(), matrixLenMono, image_mono_gpu, pitch_mono, matrixLenMono, height, cudaMemcpyDeviceToHost);
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", mat_mono_disp);
这是 RGB(或者更确切地说是 BGR)图像的代码,在从设备检索图像后,我只收到一个暗图像:
Mat mat_BGR(height, width, CV_8UC3);
Mat mat_BGR_disp(height, width, CV_8UC3);
size_t pitch_BGR;
uint8_t* image_BGR_gpu,
size_t matrixLenBGR = width * 3;
cudaMallocPitch(&image_BGR_gpu, &pitch_BGR, matrixLenBGR, height);
mat_BGR = RGBCamera.CaptureMat(1); // wrapper for the RGB camera that grabs the image
// copy to device
cudaMemcpy2D(image_BGR_gpu, pitch_BGR, mat_BGR.ptr(), width, matrixLenBGR, height, cudaMemcpyHostToDevice);
// copy back to host
cudaMemcpy2D(mat_BGR_disp.ptr(), matrixLenBGR, image_BGR_gpu, pitch_BGR, matrixLenBGR, height, cudaMemcpyDeviceToHost);
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", mat_BGR_disp);
这是否意味着使用cv::Mat:ptr
单色图像是一种特殊情况?我不知道在使用 BGR 图像时还需要考虑什么。
解决方案
推荐阅读
- jquery - 重新加载页面并更改元素的类
- c++ - 为什么擦除+删除比删除更有效
- javascript - 有记忆和没有记忆的斐波那契时间复杂度
- ruby-on-rails - 如何覆盖 will_paginate 网址?will_paginate gem 生成错误的 url
- elasticsearch - 如何根据elasticsearch中的条件删除嵌套字段中的特定对象?
- php - 配置为在其他服务器上作为 HTTPS 运行后如何强制 WordPress 使用 HTTP,--not-- HTTPS
- javascript - 使用 Angular 12 使用 js-xlsx 读取本地 Excel 文件?
- specifications - Jolt 组合在一起并包含新标签
- javascript - React:如何将参数传递给父组件
- android - 如何制作可点击的ListView