Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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++ OpenCV 3.3-使用GPU功能时出现分段错误_C++_Opencv_Cuda_Nvidia - Fatal编程技术网

C++ OpenCV 3.3-使用GPU功能时出现分段错误

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

我使用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, 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));