需求简介:
由于最近在做图像处理的项目,有时候需要快速的知道图像的最大像素值和最小像素值是多少,或者图像的最大最小像素的坐标在哪里。需要快速的得到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()