1. 程式人生 > >opencv+QT實現影象操作(影象的與、或、異或、取反、兩影象相減、RGB轉YUV、YUV轉RG等等)

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