【问题标题】:OpenCV 3.3 - segmentation fault when using GPU functionsOpenCV 3.3 - 使用 GPU 函数时出现分段错误
【发布时间】:2018-02-20 08:27:39
【问题描述】:

我使用带有 L4T 28.1 的 TX1 板。

我在板上用 DWITH_CUDA=ON 和 cuda 8.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 调用(无效参数)

有什么建议吗?

【问题讨论】:

    标签: c++ opencv cuda nvidia


    【解决方案1】:

    此代码有效:

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 2022-01-14
      • 2011-01-08
      • 1970-01-01
      • 2020-05-28
      相关资源
      最近更新 更多