Sadaei Osakabe
/
OV7670_with_AL422B_Color_Size_test
OV7670_with_AL422B Color & Size Test Program
main.cpp@4:2c412c97678c, 2013-02-18 (annotated)
- Committer:
- diasea
- Date:
- Mon Feb 18 07:53:46 2013 +0000
- Revision:
- 4:2c412c97678c
- Parent:
- 3:e23726af9d38
fix
Who changed what in which revision?
User | Revision | Line number | New 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 | } |