我使用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调用(无效参数)有什么建议吗?
答案 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));