OpenCV 3.3 - 使用GPU功能时的分段错误

时间:2018-02-20 08:27:40

标签: c++ opencv cuda nvidia

我使用TX1板和L4T 28.1。

我使用cuda 8.0工具包在DWITH_CUDA = ON上编译了opencv。

当我尝试使用使用gpu的opencv函数时,我会收到错误:

我尝试声明GpuMat:

 $collectionReference = $firestore->collection('notifications');
    $query = $collectionReference->where('so_id', '=', $so_id);
    $snapshot = $query->documents();
    foreach ($snapshot as $value) {
        echo $value['name'] . PHP_EOL;
    }

并在模块cv :: cuda :: GpuMat :: create()中运行时获取分段错误。

如果我提供分配的内存,我可以分配相同的矩阵:

GpuMat TestGpuMat(480, 640, CV_16UC1, 0x55);

在这种情况下它可以工作,但是当我尝试将GpuMat发送到cuda :: warpAffine函数时,我收到了错误,然后我得到以下异常:

OpenCVError:setTo

中的Gpu API调用(无效参数)

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

此代码有效:

cudaMallocManaged((void**)&dptr,w*h*sizeof(unsigned short));
cudaMemset(dptr,128,sizeof(unsigned short)*w*h);
//cudaDeviceSynchronize();
dptr[w/2+h*h/2] = 255;    
cuda::GpuMat d_img(h,w,CV_16UC1,dptr);

Mat h_warp = getRotationMatrix2D({w/2,h/2},-45.f,1);   

cuda::GpuMat d_res;
cuda::warpAffine(d_img,d_res,h_warp,h_img.size());

Mat h_res;
d_res.download(h_res);
imshow("window",h_res);

waitKey(0);

您也可以尝试使用cudaMalloc()或cudaMallocPitch()而不是cudaMallocManaged()。通常,托管内存有点难以处理。它需要在CPU和GPU之间的并发期间进行某种同步。如果您不知道某个函数是如何实现的,那么您应该从非托管分配开始尝试。

unsigned short* dptr;
size_t pitch;
cudaMallocPitch((void**)&dptr,&pitch,w*sizeof(unsigned short),h);
cuda::GpuMat d_img(h,w,CV_16UC1,dptr, pitch/sizeof(unsigned short));