Sadaei Osakabe
/
OV7670_with_AL422B_Color_Size_test
OV7670_with_AL422B Color & Size Test Program
main.cpp@3:e23726af9d38, 2013-02-17 (annotated)
- Committer:
- diasea
- Date:
- Sun Feb 17 12:42:55 2013 +0000
- Revision:
- 3:e23726af9d38
- Parent:
- 2:2c2fe5bc082c
- Child:
- 4:2c412c97678c
fix
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:e23726af9d38 | 439 | |
diasea | 3:e23726af9d38 | 440 | for(int i=0; i<2; i++) { |
diasea | 3:e23726af9d38 | 441 | free(bayer_line_data[i]); |
diasea | 3:e23726af9d38 | 442 | } |
diasea | 0:6be5fa68dddc | 443 | #ifdef BITMAPFILE |
diasea | 0:6be5fa68dddc | 444 | fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp); |
diasea | 0:6be5fa68dddc | 445 | #endif |
diasea | 0:6be5fa68dddc | 446 | break; |
diasea | 0:6be5fa68dddc | 447 | } |
diasea | 0:6be5fa68dddc | 448 | camera.ReadStop(); |
diasea | 0:6be5fa68dddc | 449 | |
diasea | 0:6be5fa68dddc | 450 | #ifdef BITMAPFILE |
diasea | 3:e23726af9d38 | 451 | free(bmp_line_data); |
diasea | 0:6be5fa68dddc | 452 | fclose(fp); |
diasea | 0:6be5fa68dddc | 453 | #endif |
diasea | 0:6be5fa68dddc | 454 | #ifdef HEXFILE |
diasea | 0:6be5fa68dddc | 455 | fclose(fp2); |
diasea | 0:6be5fa68dddc | 456 | #endif |
diasea | 0:6be5fa68dddc | 457 | |
diasea | 0:6be5fa68dddc | 458 | } |
diasea | 0:6be5fa68dddc | 459 | } |