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