摄像头是raw10的输出,如果是yuy2则是偏蓝色,rgb565则是偏紫色。
上层PC端软件需要自己做处理。
测试如下:
test pattern:
solid color.
{ 0x4322,0x03},//B Gb R Gr all 0x03FF
{ 0x4323,0xFF},
原始数据0x03FF,amcap软件显示的像素全为:
RGB565 : RGB 0,124,248(0,01111100,11111000)
raw原始数据:
00000011 11111111
rgb565:r:00000, g:011111 ,b: 11111.
需要转化为RGB888:
0,124,248(0,01111100,11111000)
转换规则:
R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3 (r和b都经过了右移运算,舍弃了低三位的信息,g也是舍弃了低二位的信息,所以显示出的颜色能大致符合,稍有色差(实际上是对应了调色板的索引值))
00000(000) 011111(00) 11111(000)
。。。。。
pOut = ((*pIn) >> 3) | ((pIn+1)>>2); //B5+G3 (opencv是BGR的,也就是BG倒过来)
pOut =(uchar)((*pIn) >> 5) | (uchar) ((pIn + 1)<<1);//G << 1 | B >> 5 10bitraw,去掉低2bit
总结:
不能直接告诉amcap等软件 数据格式是raw data。
下位机传输的是raw数据,但告知pc端必须为 rgb565 或 yuy2等标准格式,pc端再把rgb565 或 yuy2等格式转换为raw(gray)。
将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
RGB888-RGB565;
static void RGB2Gray(void *pInbuf, void *pOutbuf, unsigned int len)//RGB565
{
unsigned int i;
unsigned char pIn = (unsigned char)pInbuf;
unsigned char pOut = (unsigned char)pOutbuf;
for (i = 0; i < len/2; i++)//438851 G>>2 | R>>5
{
// pOut = ((*pIn) >> 3) | ((pIn+1)>>2);//B5 + G3
pOut =(uchar)((*pIn) >> 5) | (uchar) ((pIn + 1)<<1);//G << 1 | B >> 5
*(pOut+1) = *pOut;
*(pOut+2) = *pOut;
pOut += 3;
pIn += 3;
}
}
RGB565 to gray
最新推荐文章于 2023-09-01 17:16:32 发布