OV7670_with_AL422B Color & Size Test Program

Dependencies:   mbed

Committer:
diasea
Date:
Mon Feb 18 07:53:46 2013 +0000
Revision:
4:2c412c97678c
Parent:
3:e23726af9d38
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
diasea 0:6be5fa68dddc 1 #define BITMAPFILE
diasea 4:2c412c97678c 2 #undef BAYERBITMAPFILE
diasea 0:6be5fa68dddc 3 #undef HEXFILE
diasea 0:6be5fa68dddc 4 #undef COLORBAR
diasea 0:6be5fa68dddc 5
diasea 0:6be5fa68dddc 6 #include "mbed.h"
diasea 0:6be5fa68dddc 7 #include <algorithm>
diasea 0:6be5fa68dddc 8 #include "ov7670.h"
diasea 0:6be5fa68dddc 9
diasea 0:6be5fa68dddc 10 OV7670 camera(
diasea 0:6be5fa68dddc 11 p28,p27, // SDA,SCL(I2C / SCCB)
diasea 0:6be5fa68dddc 12 p12,p11,p10, // VSYNC,HREF,WEN(FIFO)
diasea 0:6be5fa68dddc 13 p24,p15,p25,p16,p26,p17,p29,p18, // D7-D0
diasea 0:6be5fa68dddc 14 p20,p30,p19) ; // RRST,OE,RCLK
diasea 0:6be5fa68dddc 15
diasea 0:6be5fa68dddc 16 LocalFileSystem local("local");
diasea 0:6be5fa68dddc 17
diasea 0:6be5fa68dddc 18 Serial pc(USBTX,USBRX) ;
diasea 0:6be5fa68dddc 19
diasea 0:6be5fa68dddc 20 int sizex = 0;
diasea 0:6be5fa68dddc 21 int sizey = 0;
diasea 0:6be5fa68dddc 22
diasea 4:2c412c97678c 23 #if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
diasea 4:2c412c97678c 24
diasea 0:6be5fa68dddc 25 #define FILEHEADERSIZE 14 //ファイルヘッダのサイズ
diasea 0:6be5fa68dddc 26 #define INFOHEADERSIZE 40 //情報ヘッダのサイズ
diasea 0:6be5fa68dddc 27 #define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE)
diasea 0:6be5fa68dddc 28
diasea 0:6be5fa68dddc 29 int create_header(FILE *fp, int width, int height) {
diasea 0:6be5fa68dddc 30 int real_width;
diasea 0:6be5fa68dddc 31 unsigned char header_buf[HEADERSIZE]; //ヘッダを格納する
diasea 0:6be5fa68dddc 32 unsigned int file_size;
diasea 0:6be5fa68dddc 33 unsigned int offset_to_data;
diasea 0:6be5fa68dddc 34 unsigned long info_header_size;
diasea 0:6be5fa68dddc 35 unsigned int planes;
diasea 0:6be5fa68dddc 36 unsigned int color;
diasea 0:6be5fa68dddc 37 unsigned long compress;
diasea 0:6be5fa68dddc 38 unsigned long data_size;
diasea 0:6be5fa68dddc 39 long xppm;
diasea 0:6be5fa68dddc 40 long yppm;
diasea 0:6be5fa68dddc 41
diasea 0:6be5fa68dddc 42 real_width = width*3 + width%4;
diasea 0:6be5fa68dddc 43
diasea 0:6be5fa68dddc 44 //ここからヘッダ作成
diasea 0:6be5fa68dddc 45 file_size = height * real_width + HEADERSIZE;
diasea 0:6be5fa68dddc 46 offset_to_data = HEADERSIZE;
diasea 0:6be5fa68dddc 47 info_header_size = INFOHEADERSIZE;
diasea 0:6be5fa68dddc 48 planes = 1;
diasea 0:6be5fa68dddc 49 color = 24;
diasea 0:6be5fa68dddc 50 compress = 0;
diasea 0:6be5fa68dddc 51 data_size = height * real_width;
diasea 0:6be5fa68dddc 52 xppm = 1;
diasea 0:6be5fa68dddc 53 yppm = 1;
diasea 0:6be5fa68dddc 54
diasea 0:6be5fa68dddc 55 header_buf[0] = 'B';
diasea 0:6be5fa68dddc 56 header_buf[1] = 'M';
diasea 0:6be5fa68dddc 57 memcpy(header_buf + 2, &file_size, sizeof(file_size));
diasea 0:6be5fa68dddc 58 header_buf[6] = 0;
diasea 0:6be5fa68dddc 59 header_buf[7] = 0;
diasea 0:6be5fa68dddc 60 header_buf[8] = 0;
diasea 0:6be5fa68dddc 61 header_buf[9] = 0;
diasea 0:6be5fa68dddc 62 memcpy(header_buf + 10, &offset_to_data, sizeof(offset_to_data));
diasea 0:6be5fa68dddc 63 memcpy(header_buf + 14, &info_header_size, sizeof(info_header_size));
diasea 0:6be5fa68dddc 64 memcpy(header_buf + 18, &width, sizeof(width));
diasea 0:6be5fa68dddc 65 height = height * -1; // データ格納順が逆なので、高さをマイナスとしている
diasea 0:6be5fa68dddc 66 memcpy(header_buf + 22, &height, sizeof(height));
diasea 0:6be5fa68dddc 67 memcpy(header_buf + 26, &planes, sizeof(planes));
diasea 0:6be5fa68dddc 68 memcpy(header_buf + 28, &color, sizeof(color));
diasea 0:6be5fa68dddc 69 memcpy(header_buf + 30, &compress, sizeof(compress));
diasea 0:6be5fa68dddc 70 memcpy(header_buf + 34, &data_size, sizeof(data_size));
diasea 0:6be5fa68dddc 71 memcpy(header_buf + 38, &xppm, sizeof(xppm));
diasea 0:6be5fa68dddc 72 memcpy(header_buf + 42, &yppm, sizeof(yppm));
diasea 0:6be5fa68dddc 73 header_buf[46] = 0;
diasea 0:6be5fa68dddc 74 header_buf[47] = 0;
diasea 0:6be5fa68dddc 75 header_buf[48] = 0;
diasea 0:6be5fa68dddc 76 header_buf[49] = 0;
diasea 0:6be5fa68dddc 77 header_buf[50] = 0;
diasea 0:6be5fa68dddc 78 header_buf[51] = 0;
diasea 0:6be5fa68dddc 79 header_buf[52] = 0;
diasea 0:6be5fa68dddc 80 header_buf[53] = 0;
diasea 0:6be5fa68dddc 81
diasea 0:6be5fa68dddc 82 //ヘッダの書き込み
diasea 0:6be5fa68dddc 83 fwrite(header_buf, sizeof(unsigned char), HEADERSIZE, fp);
diasea 0:6be5fa68dddc 84
diasea 0:6be5fa68dddc 85 return 0;
diasea 0:6be5fa68dddc 86 }
diasea 0:6be5fa68dddc 87 #endif
diasea 0:6be5fa68dddc 88
diasea 0:6be5fa68dddc 89 int main() {
diasea 0:6be5fa68dddc 90 pc.baud(115200);
diasea 0:6be5fa68dddc 91
diasea 0:6be5fa68dddc 92 pc.printf("Camera resetting..\r\n");
diasea 0:6be5fa68dddc 93 camera.Reset();
diasea 0:6be5fa68dddc 94
diasea 0:6be5fa68dddc 95 pc.printf("Before Init...\r\n");
diasea 0:6be5fa68dddc 96 camera.PrintRegister();
diasea 0:6be5fa68dddc 97
diasea 0:6be5fa68dddc 98 pc.printf("Select color format.\r\n") ;
diasea 0:6be5fa68dddc 99 pc.printf("1: RGB444.\r\n");
diasea 0:6be5fa68dddc 100 pc.printf("2: RGB555.\r\n");
diasea 0:6be5fa68dddc 101 pc.printf("3: RGB565.\r\n");
diasea 0:6be5fa68dddc 102 pc.printf("4: YUV(UYVY).\r\n");
diasea 4:2c412c97678c 103 pc.printf("5: Bayer RGB(BGBG... GRGR...).\r\n");
diasea 0:6be5fa68dddc 104
diasea 0:6be5fa68dddc 105 while(!pc.readable());
diasea 0:6be5fa68dddc 106 char color_format = pc.getc();
diasea 0:6be5fa68dddc 107 switch (color_format) {
diasea 0:6be5fa68dddc 108 case '1':
diasea 0:6be5fa68dddc 109 camera.InitRGB444();
diasea 0:6be5fa68dddc 110 break;
diasea 0:6be5fa68dddc 111 case '2':
diasea 0:6be5fa68dddc 112 camera.InitRGB555();
diasea 0:6be5fa68dddc 113 break;
diasea 0:6be5fa68dddc 114 case '3':
diasea 0:6be5fa68dddc 115 camera.InitRGB565();
diasea 0:6be5fa68dddc 116 break;
diasea 0:6be5fa68dddc 117 case '4':
diasea 0:6be5fa68dddc 118 camera.InitYUV();
diasea 0:6be5fa68dddc 119 break;
diasea 0:6be5fa68dddc 120 case '5':
diasea 0:6be5fa68dddc 121 camera.InitBayerRGB();
diasea 0:6be5fa68dddc 122 break;
diasea 0:6be5fa68dddc 123 }
diasea 0:6be5fa68dddc 124 pc.printf("select %c\r\n", color_format);
diasea 0:6be5fa68dddc 125
diasea 0:6be5fa68dddc 126 pc.printf("Select screen size.\r\n") ;
diasea 0:6be5fa68dddc 127 switch (color_format) {
diasea 0:6be5fa68dddc 128 case '5':
diasea 0:6be5fa68dddc 129 pc.printf("1: VGA(640x480).\r\n");
diasea 0:6be5fa68dddc 130 case '1':
diasea 0:6be5fa68dddc 131 case '2':
diasea 0:6be5fa68dddc 132 case '3':
diasea 0:6be5fa68dddc 133 case '4':
diasea 0:6be5fa68dddc 134 pc.printf("2: FIFO nealy limit(544x360).\r\n");
diasea 0:6be5fa68dddc 135 pc.printf("3: VGA*3/4(480x360).\r\n");
diasea 0:6be5fa68dddc 136 pc.printf("4: QVGA(320x240).\r\n");
diasea 0:6be5fa68dddc 137 pc.printf("5: QQVGA(160x120).\r\n");
diasea 0:6be5fa68dddc 138 break;
diasea 0:6be5fa68dddc 139 }
diasea 0:6be5fa68dddc 140
diasea 0:6be5fa68dddc 141 while(!pc.readable());
diasea 0:6be5fa68dddc 142 char screen_size = pc.getc() ;
diasea 0:6be5fa68dddc 143 switch (screen_size) {
diasea 0:6be5fa68dddc 144 case '1':
diasea 0:6be5fa68dddc 145 sizex = 640;
diasea 0:6be5fa68dddc 146 sizey = 480;
diasea 0:6be5fa68dddc 147 camera.InitVGA();
diasea 0:6be5fa68dddc 148 break;
diasea 0:6be5fa68dddc 149 case '2':
diasea 0:6be5fa68dddc 150 sizex = 544;
diasea 0:6be5fa68dddc 151 sizey = 360;
diasea 0:6be5fa68dddc 152 camera.InitFIFO_2bytes_color_nealy_limit_size();
diasea 0:6be5fa68dddc 153 break;
diasea 0:6be5fa68dddc 154 case '3':
diasea 0:6be5fa68dddc 155 sizex = 480;
diasea 0:6be5fa68dddc 156 sizey = 360;
diasea 0:6be5fa68dddc 157 camera.InitVGA_3_4();
diasea 0:6be5fa68dddc 158 break;
diasea 0:6be5fa68dddc 159 case '4':
diasea 0:6be5fa68dddc 160 sizex = 320;
diasea 0:6be5fa68dddc 161 sizey = 240;
diasea 0:6be5fa68dddc 162 camera.InitQVGA();
diasea 0:6be5fa68dddc 163 break;
diasea 0:6be5fa68dddc 164 case '5':
diasea 0:6be5fa68dddc 165 sizex = 160;
diasea 0:6be5fa68dddc 166 sizey = 120;
diasea 0:6be5fa68dddc 167 camera.InitQQVGA();
diasea 0:6be5fa68dddc 168 break;
diasea 0:6be5fa68dddc 169 }
diasea 0:6be5fa68dddc 170 pc.printf("select %c\r\n", screen_size);
diasea 0:6be5fa68dddc 171
diasea 4:2c412c97678c 172 camera.InitForFIFOWriteReset();
diasea 4:2c412c97678c 173 camera.InitDefaultReg();
diasea 4:2c412c97678c 174
diasea 0:6be5fa68dddc 175 #ifdef COLORBAR
diasea 0:6be5fa68dddc 176 camera.InitSetColorbar();
diasea 0:6be5fa68dddc 177 #endif
diasea 0:6be5fa68dddc 178
diasea 0:6be5fa68dddc 179 pc.printf("After Init...\r\n");
diasea 0:6be5fa68dddc 180 camera.PrintRegister();
diasea 0:6be5fa68dddc 181
diasea 0:6be5fa68dddc 182 // CAPTURE and SEND LOOP
diasea 0:6be5fa68dddc 183 while(1)
diasea 0:6be5fa68dddc 184 {
diasea 4:2c412c97678c 185 #if defined(BITMAPFILE) || defined(BAYERBITMAPFILE) || defined(HEXFILE)
diasea 0:6be5fa68dddc 186 pc.printf("Hit Any Key %dx%d Capture Data.\r\n", sizex, sizey) ;
diasea 0:6be5fa68dddc 187 while(!pc.readable());
diasea 0:6be5fa68dddc 188 pc.printf("*\r\n");
diasea 0:6be5fa68dddc 189 pc.getc();
diasea 0:6be5fa68dddc 190
diasea 0:6be5fa68dddc 191 int real_width = sizex*3 + sizey%4;
diasea 0:6be5fa68dddc 192
diasea 0:6be5fa68dddc 193 unsigned char *bmp_line_data; //画像1行分のRGB情報を格納する
diasea 0:6be5fa68dddc 194 if((bmp_line_data = (unsigned char *)malloc(sizeof(unsigned char)*real_width)) == NULL){
diasea 0:6be5fa68dddc 195 fprintf(stderr, "Error: Allocation error.\n");
diasea 0:6be5fa68dddc 196 return 1;
diasea 0:6be5fa68dddc 197 }
diasea 0:6be5fa68dddc 198
diasea 0:6be5fa68dddc 199 //RGB情報を4バイトの倍数に合わせている
diasea 0:6be5fa68dddc 200 for(int i=sizex*3; i<real_width; i++){
diasea 0:6be5fa68dddc 201 bmp_line_data[i] = 0;
diasea 0:6be5fa68dddc 202 }
diasea 0:6be5fa68dddc 203 #endif
diasea 4:2c412c97678c 204 #if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
diasea 0:6be5fa68dddc 205 FILE *fp;
diasea 0:6be5fa68dddc 206 char *filename = "/local/test.bmp";
diasea 0:6be5fa68dddc 207 if((fp = fopen(filename, "wb")) == NULL){
diasea 0:6be5fa68dddc 208 pc.printf("Error: %s could not open.", filename);
diasea 0:6be5fa68dddc 209 return 1;
diasea 0:6be5fa68dddc 210 }
diasea 0:6be5fa68dddc 211
diasea 0:6be5fa68dddc 212 create_header(fp, sizex, sizey);
diasea 0:6be5fa68dddc 213 #endif
diasea 0:6be5fa68dddc 214 #ifdef HEXFILE
diasea 0:6be5fa68dddc 215 FILE *fp2;
diasea 0:6be5fa68dddc 216 char *filename2 = "/local/test.txt";
diasea 0:6be5fa68dddc 217 if((fp2 = fopen(filename2, "w")) == NULL){
diasea 0:6be5fa68dddc 218 pc.printf("Error: %s could not open.", filename2);
diasea 0:6be5fa68dddc 219 return 1;
diasea 0:6be5fa68dddc 220 }
diasea 0:6be5fa68dddc 221 #endif
diasea 0:6be5fa68dddc 222
diasea 0:6be5fa68dddc 223 camera.CaptureNext();
diasea 0:6be5fa68dddc 224 while(camera.CaptureDone() == false);
diasea 0:6be5fa68dddc 225 camera.ReadStart();
diasea 0:6be5fa68dddc 226
diasea 0:6be5fa68dddc 227 int r=0, g=0, b=0, d1, d2;
diasea 0:6be5fa68dddc 228
diasea 0:6be5fa68dddc 229 switch (color_format) {
diasea 0:6be5fa68dddc 230 case '1':
diasea 0:6be5fa68dddc 231 case '2':
diasea 0:6be5fa68dddc 232 case '3':
diasea 0:6be5fa68dddc 233
diasea 0:6be5fa68dddc 234 for (int y=0; y<sizey; y++) {
diasea 0:6be5fa68dddc 235 for (int x=0; x<sizex; x++) {
diasea 0:6be5fa68dddc 236 d1 = camera.ReadOneByte();
diasea 0:6be5fa68dddc 237 d2 = camera.ReadOneByte();
diasea 0:6be5fa68dddc 238
diasea 0:6be5fa68dddc 239 switch (color_format) {
diasea 0:6be5fa68dddc 240 case '1':
diasea 0:6be5fa68dddc 241 // RGB444 to RGB888
diasea 0:6be5fa68dddc 242 b = (d1 & 0x0F) << 4;
diasea 0:6be5fa68dddc 243 g = (d2 & 0xF0);
diasea 0:6be5fa68dddc 244 r = (d2 & 0x0F) << 4;
diasea 0:6be5fa68dddc 245 break;
diasea 0:6be5fa68dddc 246 case '2':
diasea 0:6be5fa68dddc 247 // RGB555 to RGB888
diasea 0:6be5fa68dddc 248 b = (d1 & 0x1F) << 3;
diasea 0:6be5fa68dddc 249 g = (((d1 & 0xE0) >> 2) | ((d2 & 0x03) << 6));
diasea 0:6be5fa68dddc 250 r = (d2 & 0x7c) << 1;
diasea 0:6be5fa68dddc 251 break;
diasea 0:6be5fa68dddc 252 case '3':
diasea 0:6be5fa68dddc 253 // RGB565 to RGB888
diasea 0:6be5fa68dddc 254 b = (d1 & 0x1F) << 3;
diasea 0:6be5fa68dddc 255 g = (((d1 & 0xE0) >> 3) | ((d2 & 0x07) << 5));
diasea 0:6be5fa68dddc 256 r = (d2 & 0xF8);
diasea 0:6be5fa68dddc 257 break;
diasea 0:6be5fa68dddc 258 }
diasea 0:6be5fa68dddc 259 #if defined(BITMAPFILE) || defined(HEXFILE)
diasea 0:6be5fa68dddc 260 bmp_line_data[x*3] = (unsigned char)b;
diasea 0:6be5fa68dddc 261 bmp_line_data[x*3 + 1] = (unsigned char)g;
diasea 0:6be5fa68dddc 262 bmp_line_data[x*3 + 2] = (unsigned char)r;
diasea 0:6be5fa68dddc 263 #endif
diasea 0:6be5fa68dddc 264 /*
diasea 0:6be5fa68dddc 265 // RGB
diasea 0:6be5fa68dddc 266 pc.printf ("%2X%2X%2X", r, g, b) ;
diasea 0:6be5fa68dddc 267 */
diasea 0:6be5fa68dddc 268 }
diasea 0:6be5fa68dddc 269 #ifdef BITMAPFILE
diasea 0:6be5fa68dddc 270 fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
diasea 0:6be5fa68dddc 271 #endif
diasea 0:6be5fa68dddc 272 #ifdef HEXFILE
diasea 0:6be5fa68dddc 273 for(int i=0; i<sizex*3; i++){
diasea 0:6be5fa68dddc 274 fprintf(fp2, "%02X", bmp_line_data[i]);
diasea 0:6be5fa68dddc 275 }
diasea 0:6be5fa68dddc 276 #endif
diasea 0:6be5fa68dddc 277 // pc.printf("\r\n") ;
diasea 0:6be5fa68dddc 278 }
diasea 0:6be5fa68dddc 279 break;
diasea 0:6be5fa68dddc 280
diasea 0:6be5fa68dddc 281 case '4':
diasea 0:6be5fa68dddc 282 int index = 0;
diasea 0:6be5fa68dddc 283 for (int y=0; y<sizey; y++) {
diasea 0:6be5fa68dddc 284 int U0=0, Y0=0, V0=0, Y1=0;
diasea 0:6be5fa68dddc 285 for (int x=0; x<sizex; x++) {
diasea 0:6be5fa68dddc 286 if(index%2 == 0) {
diasea 0:6be5fa68dddc 287 U0 = camera.ReadOneByte();
diasea 0:6be5fa68dddc 288 Y0 = camera.ReadOneByte();
diasea 0:6be5fa68dddc 289 V0 = camera.ReadOneByte();
diasea 0:6be5fa68dddc 290 Y1 = camera.ReadOneByte();
diasea 0:6be5fa68dddc 291
diasea 0:6be5fa68dddc 292 b = Y0 + 1.77200 * (U0 - 128);
diasea 0:6be5fa68dddc 293 g = Y0 - 0.34414 * (U0 - 128) - 0.71414 * (V0 - 128);
diasea 0:6be5fa68dddc 294 r = Y0 + 1.40200 * (V0 - 128);
diasea 0:6be5fa68dddc 295 } else {
diasea 0:6be5fa68dddc 296 b = Y1 + 1.77200 * (U0 - 128);
diasea 0:6be5fa68dddc 297 g = Y1 - 0.34414 * (U0 - 128) - 0.71414 * (V0 - 128);
diasea 0:6be5fa68dddc 298 r = Y1 + 1.40200 * (V0 - 128);
diasea 0:6be5fa68dddc 299 }
diasea 0:6be5fa68dddc 300
diasea 0:6be5fa68dddc 301 b = min(max(b, 0), 255);
diasea 0:6be5fa68dddc 302 g = min(max(g, 0), 255);
diasea 0:6be5fa68dddc 303 r = min(max(r, 0), 255);
diasea 0:6be5fa68dddc 304
diasea 0:6be5fa68dddc 305 #if defined(BITMAPFILE) || defined(HEXFILE)
diasea 0:6be5fa68dddc 306 bmp_line_data[x*3] = (unsigned char)b;
diasea 0:6be5fa68dddc 307 bmp_line_data[x*3 + 1] = (unsigned char)g;
diasea 0:6be5fa68dddc 308 bmp_line_data[x*3 + 2] = (unsigned char)r;
diasea 0:6be5fa68dddc 309 #endif
diasea 0:6be5fa68dddc 310 /*
diasea 0:6be5fa68dddc 311 // RGB
diasea 0:6be5fa68dddc 312 pc.printf ("%2X%2X%2X", r, g, b) ;
diasea 0:6be5fa68dddc 313 */
diasea 0:6be5fa68dddc 314 index++;
diasea 0:6be5fa68dddc 315 }
diasea 0:6be5fa68dddc 316 #ifdef BITMAPFILE
diasea 0:6be5fa68dddc 317 fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
diasea 0:6be5fa68dddc 318 #endif
diasea 0:6be5fa68dddc 319 #ifdef HEXFILE
diasea 0:6be5fa68dddc 320 for(int i=0; i<sizex*3; i++){
diasea 0:6be5fa68dddc 321 fprintf(fp2, "%02X", bmp_line_data[i]);
diasea 0:6be5fa68dddc 322 }
diasea 0:6be5fa68dddc 323 #endif
diasea 0:6be5fa68dddc 324 // pc.printf("\r\n") ;
diasea 0:6be5fa68dddc 325 }
diasea 0:6be5fa68dddc 326 break;
diasea 0:6be5fa68dddc 327
diasea 0:6be5fa68dddc 328 case '5':
diasea 0:6be5fa68dddc 329 unsigned char *bayer_line[2];
diasea 0:6be5fa68dddc 330 unsigned char *bayer_line_data[2]; //画像1行分のRGB情報を格納する2行分
diasea 0:6be5fa68dddc 331 for(int i=0; i<2; i++) {
diasea 0:6be5fa68dddc 332 if((bayer_line_data[i] = (unsigned char *)malloc(sizeof(unsigned char)*sizex)) == NULL){
diasea 0:6be5fa68dddc 333 fprintf(stderr, "Error: Allocation error.\n");
diasea 0:6be5fa68dddc 334 return 1;
diasea 0:6be5fa68dddc 335 }
diasea 0:6be5fa68dddc 336 }
diasea 0:6be5fa68dddc 337
diasea 0:6be5fa68dddc 338 for (int x=0; x<sizex; x++) {
diasea 4:2c412c97678c 339 // odd line BGBG... even line GRGR...
diasea 0:6be5fa68dddc 340 bayer_line_data[0][x] = (unsigned char)camera.ReadOneByte();
diasea 4:2c412c97678c 341 #ifdef BAYERBITMAPFILE
diasea 4:2c412c97678c 342 bmp_line_data[x*3] = (unsigned char)bayer_line_data[0][x];
diasea 4:2c412c97678c 343 bmp_line_data[x*3 + 1] = (unsigned char)bayer_line_data[0][x];
diasea 4:2c412c97678c 344 bmp_line_data[x*3 + 2] = (unsigned char)bayer_line_data[0][x];
diasea 4:2c412c97678c 345 #endif
diasea 0:6be5fa68dddc 346 }
diasea 4:2c412c97678c 347 #ifdef BAYERBITMAPFILE
diasea 4:2c412c97678c 348 fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
diasea 4:2c412c97678c 349 #endif
diasea 0:6be5fa68dddc 350 bayer_line[1] = bayer_line_data[0];
diasea 0:6be5fa68dddc 351
diasea 0:6be5fa68dddc 352 for (int y=1; y<sizey; y++) {
diasea 0:6be5fa68dddc 353 int line = y%2;
diasea 0:6be5fa68dddc 354
diasea 0:6be5fa68dddc 355 for (int x=0; x<sizex; x++) {
diasea 4:2c412c97678c 356 // odd line BGBG... even line GRGR...
diasea 0:6be5fa68dddc 357 bayer_line_data[line][x] = (unsigned char)camera.ReadOneByte();
diasea 4:2c412c97678c 358 #ifdef BAYERBITMAPFILE
diasea 4:2c412c97678c 359 bmp_line_data[x*3] = (unsigned char)bayer_line_data[line][x];
diasea 4:2c412c97678c 360 bmp_line_data[x*3 + 1] = (unsigned char)bayer_line_data[line][x];
diasea 4:2c412c97678c 361 bmp_line_data[x*3 + 2] = (unsigned char)bayer_line_data[line][x];
diasea 4:2c412c97678c 362 #endif
diasea 0:6be5fa68dddc 363 }
diasea 4:2c412c97678c 364 #ifdef BAYERBITMAPFILE
diasea 4:2c412c97678c 365 fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
diasea 4:2c412c97678c 366 #endif
diasea 0:6be5fa68dddc 367 bayer_line[0] = bayer_line[1];
diasea 0:6be5fa68dddc 368 bayer_line[1] = bayer_line_data[line];
diasea 0:6be5fa68dddc 369
diasea 0:6be5fa68dddc 370 for (int x=0; x<sizex - 1; x++) {
diasea 0:6be5fa68dddc 371 if(y%2==1) {
diasea 0:6be5fa68dddc 372 if(x%2==0) {
diasea 0:6be5fa68dddc 373 // BG
diasea 0:6be5fa68dddc 374 // GR
diasea 0:6be5fa68dddc 375 b = bayer_line[0][x];
diasea 0:6be5fa68dddc 376 g = ((int)bayer_line[0][x+1] + bayer_line[1][x])>>1;
diasea 0:6be5fa68dddc 377 r = bayer_line[1][x+1];
diasea 4:2c412c97678c 378 } else {
diasea 4:2c412c97678c 379 // GB
diasea 4:2c412c97678c 380 // RG
diasea 4:2c412c97678c 381 b = bayer_line[0][x+1];
diasea 4:2c412c97678c 382 g = ((int)bayer_line[0][x] + bayer_line[1][x+1])>>1;
diasea 4:2c412c97678c 383 r = bayer_line[1][x];
diasea 0:6be5fa68dddc 384 }
diasea 0:6be5fa68dddc 385 } else {
diasea 0:6be5fa68dddc 386 if(x%2==0) {
diasea 4:2c412c97678c 387 // GR
diasea 4:2c412c97678c 388 // BG
diasea 4:2c412c97678c 389 b = bayer_line[1][x];
diasea 4:2c412c97678c 390 g = ((int)bayer_line[0][x] + bayer_line[1][x+1])>>1;
diasea 4:2c412c97678c 391 r = bayer_line[0][x+1];
diasea 4:2c412c97678c 392 } else {
diasea 0:6be5fa68dddc 393 // RG
diasea 0:6be5fa68dddc 394 // GB
diasea 0:6be5fa68dddc 395 b = bayer_line[1][x+1];
diasea 0:6be5fa68dddc 396 g = ((int)bayer_line[0][x+1] + bayer_line[1][x])>>1;
diasea 0:6be5fa68dddc 397 r = bayer_line[0][x];
diasea 0:6be5fa68dddc 398 }
diasea 0:6be5fa68dddc 399 }
diasea 0:6be5fa68dddc 400 #if defined(BITMAPFILE) || defined(HEXFILE)
diasea 0:6be5fa68dddc 401 bmp_line_data[x*3] = (unsigned char)b;
diasea 0:6be5fa68dddc 402 bmp_line_data[x*3 + 1] = (unsigned char)g;
diasea 0:6be5fa68dddc 403 bmp_line_data[x*3 + 2] = (unsigned char)r;
diasea 0:6be5fa68dddc 404 #endif
diasea 0:6be5fa68dddc 405 }
diasea 0:6be5fa68dddc 406
diasea 0:6be5fa68dddc 407 #ifdef BITMAPFILE
diasea 0:6be5fa68dddc 408 fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
diasea 0:6be5fa68dddc 409 #endif
diasea 0:6be5fa68dddc 410
diasea 0:6be5fa68dddc 411 #ifdef HEXFILE
diasea 0:6be5fa68dddc 412 for(int i=0; i<sizex*3; i++){
diasea 0:6be5fa68dddc 413 fprintf(fp2, "%02X", bmp_line_data[i]);
diasea 0:6be5fa68dddc 414 }
diasea 0:6be5fa68dddc 415 #endif
diasea 0:6be5fa68dddc 416 }
diasea 3:e23726af9d38 417
diasea 3:e23726af9d38 418 for(int i=0; i<2; i++) {
diasea 3:e23726af9d38 419 free(bayer_line_data[i]);
diasea 3:e23726af9d38 420 }
diasea 0:6be5fa68dddc 421 #ifdef BITMAPFILE
diasea 0:6be5fa68dddc 422 fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
diasea 0:6be5fa68dddc 423 #endif
diasea 0:6be5fa68dddc 424 break;
diasea 0:6be5fa68dddc 425 }
diasea 0:6be5fa68dddc 426 camera.ReadStop();
diasea 0:6be5fa68dddc 427
diasea 4:2c412c97678c 428 #if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
diasea 3:e23726af9d38 429 free(bmp_line_data);
diasea 0:6be5fa68dddc 430 fclose(fp);
diasea 0:6be5fa68dddc 431 #endif
diasea 0:6be5fa68dddc 432 #ifdef HEXFILE
diasea 0:6be5fa68dddc 433 fclose(fp2);
diasea 0:6be5fa68dddc 434 #endif
diasea 0:6be5fa68dddc 435
diasea 0:6be5fa68dddc 436 }
diasea 0:6be5fa68dddc 437 }