项目里用了OV2640摄像头,传感器采集了数据后是以RGB565的形式存在的,后面还要对其做数据处理才能还原原彩色图像,那么什么是RGB565,什么是RGB888呢?来看图。
这下明白了吗?就是拆开原来的16位数据,分成3个通道的8位数据,可见RGB565转RGB888不会有数据损失,而RGB888转RGB565会丢失色彩信息。我的ppt里右边核心代码是C++的,完整C++带函数的代码去这儿看
https://blog.csdn.net/macunshi/article/details/85724223
下面给出一段完整的MATLAB代码。
这里我还提供一张RGB565存储方式的二进制数据文件,用MATLAB代码把它解析成RGB888就可以看了,需要跑代码的到这儿去下载RGB565的二进制文件样例。
注意:
代码里我们是以16位一个数读数据的,如果是8位一个读数据,就需要把相邻的两个数进行交换然后在做RGB565转RGB888,因为图片二进制数据是嵌入式平台采集的,这里存在一个大小端的问题,ARM用的大端,Intel x86用的小端,存储方式正好相反。
代码如下:
clc
clear all;
close all;
%以16位形式打开RGB565二进制文件,博文里有样例文件下载链接
[FileName,PathName] = uigetfile('*','All Image Files','Select the image');
fidin=fopen([PathName FileName],'rb');
while ~feof(fidin)
[RGB565_16,cnt]=fread(fidin,inf,'uint16');
end
fclose(fidin);
%提取每一个像素的16位数据
A=zeros(1200,1600);
for i=1:1200
for j=1:1600
A(i,j)=RGB565_16((i-1)*1600+j);
end
end
imgR = bitshift(bitand(A,63488),-8); %十进制 63488 为二进制 11111000 00000000
imgG = bitshift(bitand(A,2016),-3); %十进制 2016 为二进制 00000111 11100000
imgB = bitshift(bitand(A,31),3); %十进制 31 为二进制 00000000 00011111
im888 = uint8(cat(3,imgR,imgG,imgB)); %组合RGB数据,然后把16位强制转化为8位
imshow(im888);
完了跑出来的照片是一张草地里由下向上拍的鱼眼照片,是这个样子的: