其实,骁龙820A搭载 Qualcomm Adreno™ 530 GPU,最高支持OpenGL ES 3.1 + 版本,可为四个显示器提供电力,包括多个 4K 显示器。但它最重要的功能是支持高质量的2D和3D导航应用,并提供惊人的高清用户界面。骁龙820A最先进的硬件构建了图形导航叠加层,最终集成3D地图。
GPU上的实时图像处理功能通过捕获汽车实际路线的原始帧来为车道检测功能提供动力。使用强度过滤器来检测道路上的标记。然后应用边缘检测,其适合直线到边缘并估计消失点。利用这些信息,GPU能够构建一个覆盖所有特征的地图。最终,图形引擎呈现出高质量的3D地图。
本篇是OV5647的调试该系列的第三篇,为了能够看到RAW数据正式效果,笔者专门研究了下raw格式的转换原理,并且开发了一个简单的转换工具。
OV5647的raw格式
OV5647支持8bit和10bit的bayer类型图像输出,通过在CSI-2总线上发送像素数据来执行8/10位原始数据传输。
表 1 RAW8 Packet Data Size Constraints
从表1可以看到raw8每一个像素点都是一个字节。
表 2 RAW10 Packet Data Size Constraints
而从表二可以看到,raw10是每四个像素点用五个字节表示,实际上每个像素点用10bit表示。
表 3 RAW8 Transmission
表 4 RAW10 Transmission
根据表3和表4可以看出raw10每四个像素点的后两位可以在每五个字节中周到对应的位置。
OV5647的数据转换工具
根据raw数据格式类型和存储格式,小编写了一个简单的数据转换的工具,否则的话需要特定的软件才能看到图像数据,具体代码如下。
参数p是从驱动接收的buffer原始数据帧。
参数name 是保存文件名字(前缀),如1.raw,1_out.rgb,1_out.yuv
static void process_image (const void * p,char* name){
//Convert raw10 to RGB24;
unsigned char* in=(unsigned char*)p;//输入数据原始帧
unsigned long lIdx=0;
RGBSumData* SumData = (RGBSumData*)malloc(1);
ColorType ct;
int iY = 0, iX = 0;
int i=0,j=0;
BYTE * image1; //RAW数据帧
image1=(BYTE*)malloc(H*W); //分配空间H*W 1920*1024
int count=0;
for(i=0;i
memcpy(image1+4*count,in+i,4);//按照表2转换,4个字节
i+=5;//由于是RAW10,需要转换,忽略第5字节
count++;
}
char originName[50];
sprintf(originName, "%s.raw", name);
file_w(image1, W * H, originName);//保存 raw data
BYTE image3[H*W*3];
BGbGrRProcess(image3,image1);//按照插值规则转换成RGB,
char rgbOutName[50];
sprintf(rgbOutName,"%s_out.rgb",name);
file_w(image3,H*W*3,rgbOutName);
BYTE * image4=(BYTE*)malloc(W*H*3/2);
BYTE * yBuffer=image4;
BYTE * uvBuffer=image4+W*H;
RGB888ToYVU420SP(image3,yBuffer,uvBuffer,W,H);//转换成YUV,方便工具解析
char yuvOutName[50];
sprintf(yuvOutName,"%s_out.yuv",name);
file_w(image4,H*W*3/2,yuvOutName);
}
后续我们重点分析下raw转RGB的实现和调试。