OV7670_with_AL422B Color & Size Test Program

Dependencies:   mbed

Committer:
diasea
Date:
Sat Feb 16 13:33:32 2013 +0000
Revision:
2:2c2fe5bc082c
Parent:
0:6be5fa68dddc
Child:
3:e23726af9d38
fix

Who changed what in which revision?

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