C++ OpenCV 3.3-使用GPU功能时出现分段错误
我使用L4T28.1的TX1板 我在主板上用DWITH_CUDA=on和cuda8.0工具包编译了opencv 当我尝试使用使用gpu的opencv函数时,会出现以下错误: 我试图声明GpuMat:C++ OpenCV 3.3-使用GPU功能时出现分段错误,c++,opencv,cuda,nvidia,C++,Opencv,Cuda,Nvidia,我使用L4T28.1的TX1板 我在主板上用DWITH_CUDA=on和cuda8.0工具包编译了opencv 当我尝试使用使用gpu的opencv函数时,会出现以下错误: 我试图声明GpuMat: GpuMat TestGpuMat(480, 640, CV_16UC1, 0x55); 并在运行时在模块cv::cuda::GpuMat::create()中获取分段错误 如果我提供分配的内存,我可以分配相同的矩阵: CudaMallocManaged((void**)&MyBuf, 6
GpuMat TestGpuMat(480, 640, CV_16UC1, 0x55);
并在运行时在模块cv::cuda::GpuMat::create()中获取分段错误
如果我提供分配的内存,我可以分配相同的矩阵:
CudaMallocManaged((void**)&MyBuf, 640*480*sizeof(unsigned short));
GpuMat TestGpuMat(480, 640, CV_16UC1, MyBuf);
在这种情况下,它可以工作,但当我尝试将GpuMat发送到cuda::warpAffine函数时收到错误,然后我得到以下异常:
OpenCVError:setTo中的Gpu API调用(无效参数)
有什么建议吗?此代码适用于:
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()或cudamallocpatch()代替cudamalocmanaged()。一般来说,托管内存比较难处理。它需要在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));