【问题标题】:How can I flip a buffer vertically during an YUV to RGB conversion如何在 YUV 到 RGB 转换期间垂直翻转缓冲区
【发布时间】:2016-08-09 18:01:25
【问题描述】:

编辑:问题不清楚抱歉,我更新并添加了详细信息。

我有一个包含图像数据(YUV 格式)的缓冲区,我将其转换为 RGB 格式。问题是,我想垂直翻转图像(反转 Y 位置)。

目前我能做的是将我的 YUV 数据转换为缓冲区中的 RGB 数据,然后垂直翻转该缓冲区。

这里是这个的工作代码:

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes)
{
    unsigned char *mycopy = new unsigned char[height*width*3];
    unsigned char *flippedCopy = new unsigned char[height*width*3];
    unsigned char* pData = (unsigned char *) frameBytes;


    //Conversion from YUV to RGB

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4)
    {
        unsigned char v = pData[j];
        unsigned char y = pData[j+1];
        unsigned char u = pData[j+2];

        mycopy[i+2] = 1.0*y + 8 + 1.402*(v-128);               // r
        mycopy[i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);   // g
        mycopy[i] = 1.0*y + 1.772*(u-128) + 0;                            // b

        y = pData[j+3];
        mycopy[i+5] = 1.0*y + 8 + 1.402*(v-128);               // r
        mycopy[i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);   // g
        mycopy[i+3] = 1.0*y + 1.772*(u-128) + 0;
    }

    //Vertical flip

    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            for (int k = 0; k < 3; ++k) {
                flippedCopy[(i + j * width) * 3 + k] = mycopy[(i + (height - 1 - j) * width) * 3 + k];
            }
        }
    }

    return flippedCopy;   
}

为了获得性能,我想要做的是翻转缓冲区从 YUV 到 RGB 的转换。我不知道该怎么做,优素福的回答帮助了我,所以这就是我目前所拥有的:

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes)
{
    unsigned char *mycopy = new unsigned char[height*width*3];
    unsigned char* pData = (unsigned char *) frameBytes;
    int k = height - 1;

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4)
    {
            unsigned char v = pData[j];
            unsigned char y = pData[j+1];
            unsigned char u = pData[j+2];

            mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128);               // r
            mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);   // g
            mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0;                            // b

            y = pData[j+3];
            mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128);               // r
            mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);   // g
            mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0;

            if (<i multiple of (width*3)-1>){ 
                k = k - 2;
            }

    }

    return mycopy;
}

如果我是正确的,这应该有效,假设 if 条件是正确的。但我不知道如何表达这个if 条件,因为i 每次递增6,所以我可能会“跳过”递减k 的正确时机

我希望我已经足够清楚了。谢谢

【问题讨论】:

  • 你好像忘了问问题。
  • 你可以使用两个循环并以相反的方式将它们保存到另一个数组中......比如高度 - i 或其他东西
  • "这里是代码" 好的。和?它有效吗?它有什么作用?您对此有何疑问?
  • 问题似乎是,至少在提供的代码中,您甚至没有尝试垂直翻转缓冲区。您是否可能忘记包含您解决问题的尝试,或者包含您正在努力解决的哪些概念阻止您首先进行此类尝试?
  • 我编辑了我的问题以添加详细信息。

标签: c++ image image-processing


【解决方案1】:

我假设宽度是均匀的,否则“减少新行”-如果会很复杂,那么你必须使用2个循环。我没有测试,但应该是这样的;

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes)
{
    unsigned char *mycopy = new unsigned char[height*width*3];
    unsigned char* pData = (unsigned char *) frameBytes;
    unsigned int k = height - 1;

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4)
    {
        unsigned char v = pData[j];
        unsigned char y = pData[j+1];
        unsigned char u = pData[j+2];

        mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128);               // r
        mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);   // g
        mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0;                            // b

        y = pData[j+3];
        mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128);               // r
        mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);   // g
        mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0;

        if (mod(i, width*3) == 0) //reduce in new line (i am not sure how to reduce it, you should think about here)
            k = k - 2;
    }

    return mycopy;
}

并将您的问题标记为图像处理等,而不仅仅是 c++

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2013-07-27
    • 2013-01-25
    • 2014-01-25
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多