gpt4 book ai didi

opencv - 使用cuda Npp颜色转换功能时的npp步错误

转载 作者:行者123 更新时间:2023-12-02 16:17:34 24 4
gpt4 key购买 nike

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

nppiBGRToYCbCr420_8u_C3P3R(const Npp8u pSrc, int nSrcStep, Npp8u pDst[3], int rDstStep[3], NppiSize oSizeROI)

我想复制 d_array[0]host_array显示 Y channel 图像并检查它,但我发现 nppiBGRToYCbCr420_8u_C3P3R返回错误 NPP_STEP_ERROR“(间距为 921600 BGR。步长为 4096(在 opencv 中,图像步长是 2 的 N 次方))。所以我希望有人能帮助我。

最佳答案

这里有两个主要问题:

  • nppiBGRToYCbCr420_8u_C3P3R将具有交错 BGR 像素值的 BGR 图像转换为一张 Y 图像、一张 Cb 图像和一张 Cr 图像。 IE。图像在三个分离的平面中输出,因此是“C3P3”中的 P。
  • 由于 420 编码,颜色信息被二次采样,这意味着 Cb 和 Cr 的图像平面只有原始图像的一半大小。

  • 并且使用 nppiMalloc_8u_C1 分配设备输出图像会给出类似的结果(为简单起见省略错误检查并在浏览器中编写而不检查):
        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);

    关于opencv - 使用cuda Npp颜色转换功能时的npp步错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319972/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com