cudaMemcpy2D来垫

时间:2017-06-13 18:08:36

标签: c++ opencv cuda

我将使用cuda样本中的grabcutNPP来加速图像处理。原始示例代码是为FIBITMAP实现的,但我的输入/输出类型将是Mat。

我已经找到了大部分代码,但仍然坚持cudaMemcpyDeviceToHost步骤...作为一名CUDA初学者,我没有理由为什么它总是在这一步停止

以下是我的代码的一部分:

void grabcutGPU(Mat& _src, Mat& _dst, Rect _srcRect){

GrabCut *grabcut;
const size_t width = _src.rows;
const size_t height = _src.cols;
size_t image_pitch; 
size_t result_pitch;
size_t trimap_pitch;
uchar4 *gpu_src, *gpu_dst;
unsigned char *d_trimap;
NppiRect rect;


// rect to nppirect
rect.x = _srcRect.x;
rect.y = _srcRect.y;
rect.width = _srcRect.width;
rect.height = _srcRect.height;


//melloc for src_image
checkCudaErrors(cudaMallocPitch(&gpu_src, &image_pitch, width * sizeof(uchar4), height));
checkCudaErrors(cudaMemcpy2D(gpu_src, image_pitch, _src.ptr<uchar4>(), width * sizeof(uchar4), width * sizeof(uchar4), height, cudaMemcpyHostToDevice));
// melloc foe rect
checkCudaErrors(cudaMallocPitch(&d_trimap, &trimap_pitch, width, height));


// Setup GrabCut
grabcut = new GrabCut(gpu_src, (int)image_pitch, d_trimap, (int)trimap_pitch, width, height);
//rect to memory
checkCudaErrors(TrimapFromRect(d_trimap, (int)trimap_pitch, rect, width, height));

//grabcut segmentation
grabcut->computeSegmentationFromTrimap();

//melloc for dst_image
checkCudaErrors(cudaMallocPitch(&gpu_dst, &result_pitch, width * 4, height));
//GPU process
checkCudaErrors(ApplyMatte(2, gpu_dst, (int)result_pitch, gpu_src, (int)image_pitch, grabcut->getAlpha(), grabcut->getAlphaPitch(), width, height));
size_t output_pitch = result_pitch;

//send result to dst
checkCudaErrors(cudaMemcpy2D(_dst.ptr(), (int)output_pitch, gpu_dst, result_pitch, width * 4, height, cudaMemcpyDeviceToHost));

delete grabcut;
checkCudaErrors(cudaDeviceSynchronize(), "Kernel Launch Failed");
checkCudaErrors(cudaFree(gpu_src), "CUDA Free Failed");
checkCudaErrors(cudaFree(gpu_dst));
checkCudaErrors(cudaFree(d_trimap), "CUDA Free Failed");}

1 个答案:

答案 0 :(得分:0)

这个问题已经解决了。

首先,行和col不小心弄错了。

然后,输入垫是3个通道,但是这个功能需要4个通道垫来传递结果。它可以通过转换颜色类型来解决。

感谢Micka,或者我可能永远不会注意到频道问题。