首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cuda颜色转换函数时的Npp阶跃误差

使用cuda颜色转换函数时的Npp阶跃误差
EN

Stack Overflow用户
提问于 2014-04-27 06:02:29
回答 1查看 1.3K关注 0票数 1

我使用nppiBGRToYCbCr420_8u_C3P3R将RGB图像转换为YUV420。函数参数如下:

代码语言:javascript
复制
nppiBGRToYCbCr420_8u_C3P3R(const Npp8u pSrc, int nSrcStep, Npp8u pDst[3], int rDstStep[3], NppiSize oSizeROI)

我想将d_array[0]复制到host_array以显示Y通道图像并检查它,但我发现nppiBGRToYCbCr420_8u_C3P3R返回误差NPP_STEP_ERROR“(螺距为921600 BGR.step为4096(在opencv中,图像步长为N次方).So,希望有人能帮我。

EN

回答 1

Stack Overflow用户

发布于 2014-04-27 10:25:25

这里有两个主要问题:

  1. nppiBGRToYCbCr420_8u_C3P3R将具有交错BGR像素值的BGR图像转换为一个Y图像、一个Cb图像和一个Cr图像。即图像在三个分离平面上输出,从而得到“C3P3”中的P。
  2. 由于420编码,对颜色信息进行了亚采样,这意味着Cb和Cr的图像平面只有原始图像的一半大小。

使用nppiMalloc_8u_C1分配设备输出映像将提供类似的结果(为了简单起见,省略错误检查,并在浏览器中写入而不进行检查):

代码语言:javascript
复制
    Mat temp = imread("1.jpg",1);
    Npp8u *d_arrayY, *d_arrayCB, *d_arrayCR;
    GpuMat BGR(temp);

    unsigned char *host_array = (unsigned char*)malloc(temp.cols * temp.rows * sizeof(unsigned char ));
    memset(host_array,0,temp.cols * temp.rows * sizeof(unsigned char));

    size_t pitchY, pitchCB, pitchCR ;
    d_arrayY = nppiMalloc_8u_C1(temp.cols, temp.rows, &pitchY); 
    d_arrayCB = nppiMalloc_8u_C1(temp.cols/2, temp.rows/2, &pitchCB); 
    d_arrayCR = nppiMalloc_8u_C1(temp.cols/2, temp.rows/2, &pitchCR); 

    int Dstep[3] = {pitchY,pitchCB,pitchCR};
    Npp8u* d_ptrs[3] = {d_arrayY, d_arrayCB, d_arrayCR};

    NppiSize ds;
    ds.height = temp.rows;
    ds.width  = temp.cols;
    nppiBGRToYCbCr420_8u_C3P3R(BGR.ptr<Npp8u>(), BGR.step, d_ptrs, Dstep, ds);

    cudaMemcpy2D(host_array, temp.cols, d_arrayY, pitchY, temp.cols * sizeof(Npp8u), temp.rows, cudaMemcpyDeviceToHost);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23319972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档