android camer raw,How to capture raw image from android camera

本文档详细介绍了如何使用C++代码将 Bayer 格式图像转换为 RGB,通过逐像素操作处理并优化色彩,适用于10位 Bayer 图像,支持格式2-5。展示了调试过程和关键函数DumpImage的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//Ugly code to convert bayer to rgb

//test__1604x1206_10_2b.raw

//test__1284x966_10_3.raw

#include

unsigned short int bayerImage[2500][3500]; //times 3 allows for forming an RGB image for debugging

unsigned char bmpImage[30000000]; //times 3 allows for forming an RGB image for debugging

#include

#include

#include "bayer2rgb.h"

#include

#include

/*****************************************************************************

**

*/

int DumpImage( char* pszFilename, BYTE* pImage, int bmpWidth, int bmpHeight,int bmpBits,int bmpFormat)

{

FILE *bayerFile;

FILE *rgbFile;

int x,y;

unsigned char lowOrder,highOrder;

unsigned char bmpchar;

unsigned short bayerVal;

unsigned char bmpheader[62];

char FullFilename[MY_MAX_PATH];

unsigned int bmrgbFilesize;

unsigned int minPixel=100000;

unsigned int maxPixel=0;

static unsigned int rgbValues[4][1024];

/*expecting 10 bit bayer */

if(bmpBits!=10)

{

printf("invalid bit specification\n");

return(-1);

}

if(bmpHeight >= 0)

{

bmrgbFilesize = (((bmpWidth*24+31)/32)*4)*bmpHeight;

}

else

{

bmrgbFilesize = (((bmpWidth*24+31)/32)*4)*(-bmpHeight);

}

#ifdef LINUX

strcpy( FullFilename, pszFilename );

rgbFile = fopen( FullFilename, "w+b" );

if( rgbFile )

#else

strcpy_s( FullFilename, sizeof(FullFilename), pszFilename );

errno_t errno;

errno = fopen_s( &bayerFile, FullFilename, "r+b" );

if(errno == 0)

{

printf("size %d", strlen(FullFilename)-4);

memcpy(&FullFilename[strlen(FullFilename)-4],".bmp",4);

errno = fopen_s( &rgbFile, FullFilename, "w+b" );

}

if ( errno == 0 )

#endif

{

/* 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 */

/* 0 R G R G R G 0 G R G R G R 0 B G B G B G */

/* 1 G B G B G B 1 B G B G B G 1 G R G R G R */

/* 2 R G R G R G 2 G R G R G R 2 B G B G B G */

/* 3 G B G B G B 3 B G B G B G 3 G R G R G R */

memset(bmpImage,255,sizeof(bmpImage));

switch(bmpFormat)

{

case 2:

// 0 1 2 3 4 5

// 0 G R G R G R

// 1 B G B G B G

// 2 G R G R G R

// 3 B G B G B G

for(y=0;y

{

for(x=0;x

{

lowOrder=fgetc(bayerFile);

highOrder=fgetc(bayerFile);

bayerVal=(highOrder * 0x100);

bayerVal+=lowOrder;

bayerImage[y][x]=bayerVal;

if(bayerVal

{

minPixel=bayerVal;

}

if(bayerVal>maxPixel)

{

maxPixel=bayerVal;

}

if(y%2==0)

{

if(x%2==0)

{

//green

bayerImage[y][x]=bayerVal/2;

//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.65;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[0][bayerVal]++;

}

else

{

//red

bayerImage[y][x]=bayerVal/2;

//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.85;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[1][bayerVal]++;

}

}

else

{

if(x%2==0)

{

//blue

bayerImage[y][x]=bayerVal/2;

//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.85;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[2][bayerVal]++;

}

else

{

//green

bayerImage[y][x]=bayerVal/2;

//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.65;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[3][bayerVal]++;

}

}

}

}

for(y=1;y

{

for(x=1;x

{

bmpchar=bayerImage[y][x]/4;

if(y%2==0)

{

if(x%2==0)

{

//green pixel bayerImage[y][x]

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//red

}

else

{

//red pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x]);//red

}

}

else

{

if(x%2==0)

{

//blue pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=bayerImage[y][x];//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//red

}

else

{

//green pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//red

}

}

}

}

break;

case 3:

printf("format 3\n");

// 0 1 2 3 4 5

// 0 R G R G R G

// 1 G B G B G B

// 2 R G R G R G

// 3 G B G B G B

for(y=0;y

{

for(x=0;x

{

lowOrder=fgetc(bayerFile);

highOrder=fgetc(bayerFile);

bayerVal=(highOrder * 0x100);

bayerVal+=lowOrder;

bayerImage[y][x]=bayerVal;

if(bayerVal

{

minPixel=bayerVal;

}

if(bayerVal>maxPixel)

{

maxPixel=bayerVal;

}

if(y%2==0)

{

if(x%2==0)

{

//red

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.85;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[1][bayerVal]++;

}

else

{

//green

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

bayerImage[y][x]*=.65;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[0][bayerVal]++;

}

}

else

{

if(x%2==0)

{

//green

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

bayerImage[y][x]*=.65;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[3][bayerVal]++;

}

else

{

//blue

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.85;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[2][bayerVal]++;

}

}

}

}

for(y=1;y

{

for(x=1;x

{

bmpchar=bayerImage[y][x]/4;

if(y%2==0)

{

if(x%2==0)

{

//red pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=bayerImage[y][x];//red

}

else

{

//green pixel bayerImage[y][x]

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//red

}

}

else

{

if(x%2==0)

{

//green pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//red

}

else

{

//blue pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=bayerImage[y][x];//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//red

}

}

}

}

break;

case 4:

// 0 1 2 3 4 5

// 0 G R G R G R

// 1 B G B G B G

// 2 G R G R G R

// 3 B G B G B G

for(y=0;y

{

for(x=0;x

{

lowOrder=fgetc(bayerFile);

highOrder=fgetc(bayerFile);

bayerVal=(highOrder * 0x100);

bayerVal+=lowOrder;

bayerImage[y][x]=bayerVal;

if(bayerVal

{

minPixel=bayerVal;

}

if(bayerVal>maxPixel)

{

maxPixel=bayerVal;

}

if(y%2==0)

{

if(x%2==0)

{

//green

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

bayerImage[y][x]*=.65;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[0][bayerVal]++;

}

else

{

//red

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.85;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[1][bayerVal]++;

}

}

else

{

if(x%2==0)

{

//blue

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

//bayerImage[y][x]*=.85;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[2][bayerVal]++;

}

else

{

//green

bayerImage[y][x]=bayerVal;

if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

bayerImage[y][x]*=.65;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[3][bayerVal]++;

}

}

}

}

for(y=1;y

{

for(x=1;x

{

bmpchar=bayerImage[y][x]/4;

if(y%2==0)

{

if(x%2==0)

{

//green pixel bayerImage[y][x]

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y][x+1]+bayerImage[y+1][x])/3;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red

}

else

{

//red pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y][x+1]+bayerImage[y+1][x+1])/3;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red

}

}

else

{

if(x%2==0)

{

//blue pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y+1][x]+bayerImage[y+1][x+1])/3;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red

}

else

{

//green pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y][x+1]+bayerImage[y+1][x])/3;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red

}

}

}

}

break;

case 5:

// 0 1 2 3 4 5

// 0 G R G R G R

// 1 B G B G B G

// 2 G R G R G R

// 3 B G B G B G

for(y=0;y

{

for(x=0;x

{

lowOrder=fgetc(bayerFile);

highOrder=fgetc(bayerFile);

bayerVal=(highOrder * 0x100);

bayerVal+=lowOrder;

bayerImage[y][x]=bayerVal;

if(bayerVal

{

minPixel=bayerVal;

}

if(bayerVal>maxPixel)

{

maxPixel=bayerVal;

}

if(y%2==0)

{

if(x%2==0)

{

//green

bayerImage[y][x]=bayerVal;

//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

bayerImage[y][x]/=256;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[0][bayerVal]++;

}

else

{

//red

bayerImage[y][x]=bayerVal;

//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

bayerImage[y][x]/=256;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[1][bayerVal]++;

}

}

else

{

if(x%2==0)

{

//blue

bayerImage[y][x]=bayerVal;

//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;

bayerImage[y][x]/=256;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[2][bayerVal]++;

}

else

{

//green

bayerImage[y][x]=bayerVal;

//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;

bayerImage[y][x]/=256;

if(bayerImage[y][x]>255)

bayerImage[y][x]=255;

rgbValues[3][bayerVal]++;

}

}

}

}

for(y=1;y

{

for(x=1;x

{

bmpchar=bayerImage[y][x]/4;

if(y%2==0)

{

if(x%2==0)

{

//green pixel bayerImage[y][x]

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//red

}

else

{

//red pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x]);//red

}

}

else

{

if(x%2==0)

{

//blue pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=bayerImage[y][x];//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//red

}

else

{

//green pixel

bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//blue

bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green

bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//red

}

}

}

}

break;

default:

printf("undefined bit format\n");

return(-3);

break;

}

bmpheader[0]='\x42';

bmpheader[1]='\x4d';

bmpheader[2]='\x38';

bmpheader[3]='\x00';

bmpheader[4]='\x90';

bmpheader[5]='\x00';

bmpheader[6]='\x00';

bmpheader[7]='\x00';

bmpheader[8]='\x00';

bmpheader[9]='\x00';

bmpheader[10]='\x36';

bmpheader[11]='\x00';

bmpheader[12]='\x00';

bmpheader[13]='\x00';

bmpheader[14]='\x28';

bmpheader[15]='\x00';

bmpheader[16]='\x00';

bmpheader[17]='\x00';

bmpheader[18]='\x00';

bmpheader[19]='\x08';

bmpheader[20]='\x00';

bmpheader[21]='\x00';

bmpheader[22]='\x00';

bmpheader[23]='\x06';

bmpheader[24]='\x00';

bmpheader[25]='\x00';

bmpheader[26]='\x01';

bmpheader[27]='\x00';

bmpheader[28]='\x18';

bmpheader[29]='\x00';

bmpheader[30]='\x00';

bmpheader[31]='\x00';

bmpheader[32]='\x00';

bmpheader[33]='\x00';

bmpheader[34]='\x00';

bmpheader[35]='\x00';

bmpheader[36]='\x00';

bmpheader[37]='\x00';

bmpheader[38]='\x5a';

bmpheader[39]='\x37';

bmpheader[40]='\x00';

bmpheader[41]='\x00';

bmpheader[42]='\x5a';

bmpheader[43]='\x37';

bmpheader[44]='\x00';

bmpheader[45]='\x00';

bmpheader[46]='\x00';

bmpheader[47]='\x00';

bmpheader[48]='\x00';

bmpheader[49]='\x00';

bmpheader[50]='\x00';

bmpheader[51]='\x00';

bmpheader[52]='\x00';

bmpheader[53]='\x00';

memcpy(&bmpheader[2],&bmrgbFilesize,4);

memcpy(&bmpheader[18],&bmpWidth,4);

memcpy(&bmpheader[22],&bmpHeight,4);

fwrite( bmpheader, 1, 54, rgbFile );

fwrite( pImage, 1, bmrgbFilesize, rgbFile );

fclose( rgbFile );

fclose( bayerFile );

return(1);

}

return(-2);

} // end DumpImage()

int main(int argc, char* argv[])

{

if(argc !=2)

{

printf("wrong number of arugments\n");

printf("drag file to decode on top of program icon\n");

return(-1);

}

else

{

printf("%s\n",argv[0]);

printf("%s\n",argv[1]);

}

/*

char *str = "sdfadabcGGGGGGGGG";

char *result = strstr(str, "abc");

int position = result - str;

int substringLength = strlen(str) - position;

*/

char *widthStr = strstr(argv[1],"__")+2;

int widthInt=atoi(widthStr);

char *heightStr = strstr(widthStr,"x")+1;

int heightInt=atoi(heightStr);

char *bitsStr = strstr(heightStr,"_")+1;

int bitsInt=atoi(bitsStr);

char *formatStr = strstr(bitsStr,"_")+1;

int formatInt=atoi(formatStr);

//DumpImage( argv[1], bmpImage, widthInt, heightInt,bitsInt,formatInt);

DumpImage( argv[1], bmpImage, widthInt, heightInt,bitsInt,2);

printf("done\n");

return 1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值