Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)_C++_Opencv_Cuda - Fatal编程技术网

C++ C++;:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)

C++ C++;:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat),c++,opencv,cuda,C++,Opencv,Cuda,我正在进行图像处理,并使用OpenCV为RGB和单色相机开发相机包装。现在我必须使用一种与CUDA一起工作的现有算法来处理这两个摄像头图像流。为此,我必须将Mat图像复制到我的设备上(该算法不需要gpumat)。我使用cv::Mat::ptr访问图像的数据。当我使用cudaMemcpy2D将图像返回主机时,我收到一个RGB图像的暗图像(仅零)。即使我使用cudaMemcpy2D将其加载到设备中,并在下一步使用cudaMemcpy2D将其带回来,它也不会工作(我的意思是在这两者之间我不会做任何图像

我正在进行图像处理,并使用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映像时,我不知道我还需要考虑什么。

< P>如在A中指出的,在执行OpenCV-MAD的2D内存拷贝到使用<代码> CUDAMALROSPOTION/CODE >(或任何)分配的设备内存时,我们必须使用OpenCV-MAT的<代码>步骤< /代码>成员来指定每行的对齐方式。

在提供的代码中,正确的方法是使用
mat\u BGR.step
而不是
cudaMemcpy2D
的第四个参数中的
width

cudaMemcpy2D(image_BGR_gpu, pitch_BGR, mat_BGR.ptr(), mat_BGR.step, matrixLenBGR, height, cudaMemcpyHostToDevice);
                                                              ^^^^
正如a中所指出的,当执行OpenCV Mat的2D内存复制到使用
CudamAllocPicch
(或任何)分配的设备内存时,我们必须使用OpenCV Mat的
步骤
成员来指定每行的对齐方式

在提供的代码中,正确的方法是使用
mat\u BGR.step
而不是
cudaMemcpy2D
的第四个参数中的
width

cudaMemcpy2D(image_BGR_gpu, pitch_BGR, mat_BGR.ptr(), mat_BGR.step, matrixLenBGR, height, cudaMemcpyHostToDevice);
                                                              ^^^^

mat
复制到设备时,请使用
mat\u BGR.step
而不是
cudaMemcpy2D
的第四个参数中的
width
。@sgarizvi:如果您想添加很多,这将是对这个问题的完美简短回答谢谢,这是解决方案@sgarizvi在将
mat
复制到设备时,使用
mat\u BGR.step
而不是
cudaMemcpy2D
的第四个参数中的
width
。@sgarizvi:如果您愿意添加它,这将是一个完美的简短回答。谢谢,这是解决方案@斯加里兹维