opencv+QT实现图像操作(图像的与、或、异或、取反、两图像相减、RGB转YUV、YUV转RG等等)

需求简介:

由于最近在做图像处理的项目,有时候需要快速的知道图像的最大像素值和最小像素值是多少,或者图像的最大最小像素的坐标在哪里。需要快速的得到RGB图像中的R、G、B当中的某个通道。需要把RGB图像转成YUV数据存储。需要把YUV数据转成RGB图片保存。当每次需要用到这些功能是,都得单独写代买去转换,非常麻烦而且浪费时间。所以自己写了这个小工具。

主要用到的函数:

1、两图像相减:cvSub()

2、两图像相与:cvAnd()

3、两图像相或:cvOr()

4、两图像亦或:cvXor()

5、求图像的最大小值和最大最小值的坐标:cvMinMaxLoc()

6、RGB转YUV422:rgb2Yuv422Packed()

/*******************************
    yuv422Packed format 数据排列:
    Y0U0Y1V1Y2U2Y3V3.....
    ................
*******************************/
void MainWindow::rgb2Yuv422Packed(const unsigned char *rgbData, int width, int height, int widthstep, unsigned char *yuvData)
{
    int index = 0;
    for (int y = 0; y < height; y++)
    {
        bool bsetU = true;
        for (int x = 0; x < width; x++)
        {
            unsigned char b = rgbData[y * widthstep + 3 * x + 0];
            unsigned char g = rgbData[y * widthstep + 3 * x + 1];
            unsigned char r = rgbData[y * widthstep + 3 * x + 2];
            yuvData[index++] = GetY(r, g, b);
            yuvData[index++] = (bsetU ? GetU(r, g, b) : GetV(r, g, b));
            bsetU = !bsetU;
        }
    }
}

7、YUV422转RGB:yuv2RgbImage()

//YUV转RGB
void MainWindow::yuv2RgbImage(char *pImageDataBuf, bool bSwitchRedBlue, unsigned char *pYuvDataBuf)
{
    unsigned char* pImagebuf = (unsigned char *)pYuvDataBuf;
    int i, j;

    for(j = 0; j < 1080; j++, pYuvDataBuf += 3840)
    {
        for (i = 0; i < 2 * 1920; i += 4, pImageDataBuf += 6)
        {
            int u = (int)(pYuvDataBuf[i + 3]) - 128;
            int v = (int)(pYuvDataBuf[i + 1]) - 128;

            int ruv = (1 << 19) + 2130771 * v;
            int guv = (1 << 19) - 413812 * v - 608826 * u;
            int buv = (1 << 19) + 1195253 * u;
            if (bSwitchRedBlue)
            {
                int temp = ruv;
                ruv = buv;
                buv = temp;
            }

            int y00 = max(0, (int)(pYuvDataBuf[i + 0])) << 20;
            pImageDataBuf[0] = INT_TO_UCHAR((y00 + ruv) >> 20);
            pImageDataBuf[1] = INT_TO_UCHAR((y00 + guv) >> 20);
            pImageDataBuf[2] = INT_TO_UCHAR((y00 + buv) >> 20);

            int y01 = max(0, (int)(pYuvDataBuf[i + 2])) << 20;
            pImageDataBuf[3] = INT_TO_UCHAR((y01 + ruv) >> 20);
            pImageDataBuf[4] = INT_TO_UCHAR((y01 + guv) >> 20);
            pImageDataBuf[5] = INT_TO_UCHAR((y01 + buv) >> 20);
        }
    }

    pYuvDataBuf = pImagebuf;
}

8、分离图像R、G、B三通道:cvSplit()

工程源码链接:https://download.csdn.net/download/cwj066/10668305

猜你喜欢

转载自blog.csdn.net/cwj066/article/details/82712036
今日推荐