CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存
Dependencies: SDFileSystem mbed
main.cpp@4:ed062dc75c52, 2014-02-04 (annotated)
- Committer:
- TETSUYA
- Date:
- Tue Feb 04 05:42:17 2014 +0000
- Revision:
- 4:ed062dc75c52
- Parent:
- 3:8d5594ce5b00
???????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TETSUYA | 0:1648bb4e70e5 | 1 | /* |
TETSUYA | 0:1648bb4e70e5 | 2 | Toragi-CCD-Cam OV7670andFIFO sample use driver |
TETSUYA | 0:1648bb4e70e5 | 3 | |
TETSUYA | 0:1648bb4e70e5 | 4 | Sadaei Osakabe ( http://mbed.org/users/diasea/ ) |
TETSUYA | 0:1648bb4e70e5 | 5 | http://mbed.org/users/diasea/code/OV7670_with_AL422B_Color_Size_test/ |
TETSUYA | 0:1648bb4e70e5 | 6 | |
TETSUYA | 3:8d5594ce5b00 | 7 | SDFileSystem |
TETSUYA | 3:8d5594ce5b00 | 8 | http://mbed.org/users/mbed_official/code/SDFileSystem/docs/tip/ |
TETSUYA | 3:8d5594ce5b00 | 9 | |
TETSUYA | 3:8d5594ce5b00 | 10 | mbed_debug.h |
TETSUYA | 3:8d5594ce5b00 | 11 | https://github.com/adamgreen/SmoothieTest/blob/master/mbed/src/capi/mbed_debug.h |
TETSUYA | 0:1648bb4e70e5 | 12 | */ |
TETSUYA | 3:8d5594ce5b00 | 13 | #include "mbed.h" |
TETSUYA | 3:8d5594ce5b00 | 14 | #include "SDFileSystem.h" |
TETSUYA | 1:c822ea77c7b2 | 15 | #include <string.h> |
TETSUYA | 1:c822ea77c7b2 | 16 | #include <math.h> |
TETSUYA | 0:1648bb4e70e5 | 17 | #include <algorithm> |
TETSUYA | 0:1648bb4e70e5 | 18 | #include "ov7670.h" |
TETSUYA | 0:1648bb4e70e5 | 19 | |
TETSUYA | 2:3aed552f3385 | 20 | |
TETSUYA | 0:1648bb4e70e5 | 21 | #define QQVGA |
TETSUYA | 0:1648bb4e70e5 | 22 | #ifdef QQVGA |
TETSUYA | 0:1648bb4e70e5 | 23 | # define SIZEX (160) |
TETSUYA | 0:1648bb4e70e5 | 24 | # define SIZEY (120) |
TETSUYA | 0:1648bb4e70e5 | 25 | #else |
TETSUYA | 0:1648bb4e70e5 | 26 | # define SIZEX (320) |
TETSUYA | 0:1648bb4e70e5 | 27 | # define SIZEY (240) |
TETSUYA | 0:1648bb4e70e5 | 28 | #endif |
TETSUYA | 0:1648bb4e70e5 | 29 | |
TETSUYA | 4:ed062dc75c52 | 30 | #define COLORS 8 // 8bit colors |
TETSUYA | 4:ed062dc75c52 | 31 | //#define COLORS 24 // 24bit colors |
TETSUYA | 4:ed062dc75c52 | 32 | |
TETSUYA | 3:8d5594ce5b00 | 33 | int create_header(FILE *fp, int width, int height) ; |
TETSUYA | 3:8d5594ce5b00 | 34 | |
TETSUYA | 3:8d5594ce5b00 | 35 | #define FILEHEADERSIZE 14 //ファイルヘッダのサイズ |
TETSUYA | 3:8d5594ce5b00 | 36 | #define INFOHEADERSIZE 40 //情報ヘッダのサイズ |
TETSUYA | 3:8d5594ce5b00 | 37 | #define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE) |
TETSUYA | 3:8d5594ce5b00 | 38 | |
TETSUYA | 3:8d5594ce5b00 | 39 | |
TETSUYA | 0:1648bb4e70e5 | 40 | OV7670 camera( |
TETSUYA | 0:1648bb4e70e5 | 41 | p28,p27, // SDA,SCL(I2C / SCCB) |
TETSUYA | 0:1648bb4e70e5 | 42 | p25,p26,p29, // VSYNC,HREF,WEN(FIFO) |
TETSUYA | 0:1648bb4e70e5 | 43 | p24,p23,p22,p21,p20,p19,p18,p17, // D7-D0 |
TETSUYA | 0:1648bb4e70e5 | 44 | p5,p6,p7) ; // RRST,OE,RCLK |
TETSUYA | 0:1648bb4e70e5 | 45 | |
TETSUYA | 3:8d5594ce5b00 | 46 | |
TETSUYA | 0:1648bb4e70e5 | 47 | |
TETSUYA | 3:8d5594ce5b00 | 48 | SDFileSystem sd(p11, p12, p13, p14, "sd"); // mosi, miso, sclk, cs |
TETSUYA | 0:1648bb4e70e5 | 49 | |
TETSUYA | 0:1648bb4e70e5 | 50 | LocalFileSystem local("local"); |
TETSUYA | 2:3aed552f3385 | 51 | BusOut myleds(LED1, LED2, LED3, LED4); |
TETSUYA | 2:3aed552f3385 | 52 | |
TETSUYA | 0:1648bb4e70e5 | 53 | Serial pc(USBTX,USBRX) ; |
TETSUYA | 0:1648bb4e70e5 | 54 | |
TETSUYA | 0:1648bb4e70e5 | 55 | int sizex = 0; |
TETSUYA | 0:1648bb4e70e5 | 56 | int sizey = 0; |
TETSUYA | 3:8d5594ce5b00 | 57 | int FileNo = 0; |
TETSUYA | 0:1648bb4e70e5 | 58 | |
TETSUYA | 1:c822ea77c7b2 | 59 | #define AREA_X 32 |
TETSUYA | 1:c822ea77c7b2 | 60 | #define AREA_Y 24 |
TETSUYA | 2:3aed552f3385 | 61 | #define AREA_DIV_X 5 |
TETSUYA | 2:3aed552f3385 | 62 | #define AREA_DIV_Y 5 |
TETSUYA | 2:3aed552f3385 | 63 | //#define AREA_THRESH 12000 |
TETSUYA | 3:8d5594ce5b00 | 64 | #define AREA_THRESH 5000 |
TETSUYA | 2:3aed552f3385 | 65 | |
TETSUYA | 1:c822ea77c7b2 | 66 | |
TETSUYA | 3:8d5594ce5b00 | 67 | char canvas[SIZEX][SIZEY] ; //18.5KB [0]gray [1]Median |
TETSUYA | 3:8d5594ce5b00 | 68 | signed short AreaDiff[2][AREA_DIV_X][AREA_DIV_Y]; // 5x5 Area = 32x24dot Each Block |
TETSUYA | 1:c822ea77c7b2 | 69 | int face_bank = 0; |
TETSUYA | 2:3aed552f3385 | 70 | int Dbmode = 0; |
TETSUYA | 3:8d5594ce5b00 | 71 | void MedianFilter(void); |
TETSUYA | 4:ed062dc75c52 | 72 | void SaveBMP(int flag); |
TETSUYA | 3:8d5594ce5b00 | 73 | void SearchNewFileNo(); |
TETSUYA | 1:c822ea77c7b2 | 74 | |
TETSUYA | 0:1648bb4e70e5 | 75 | |
TETSUYA | 0:1648bb4e70e5 | 76 | int main() { |
TETSUYA | 0:1648bb4e70e5 | 77 | char color_format = 0; |
TETSUYA | 0:1648bb4e70e5 | 78 | char c; |
TETSUYA | 1:c822ea77c7b2 | 79 | int d1,d2 ; |
TETSUYA | 4:ed062dc75c52 | 80 | //int mx, pixel , i; |
TETSUYA | 4:ed062dc75c52 | 81 | int pixel ; |
TETSUYA | 1:c822ea77c7b2 | 82 | int pixc, pixelg; |
TETSUYA | 1:c822ea77c7b2 | 83 | int sort[3]; |
TETSUYA | 1:c822ea77c7b2 | 84 | int ay = 0; |
TETSUYA | 4:ed062dc75c52 | 85 | //char UseMedian = 0; |
TETSUYA | 1:c822ea77c7b2 | 86 | |
TETSUYA | 1:c822ea77c7b2 | 87 | memset( AreaDiff, '\0', sizeof(AreaDiff)); |
TETSUYA | 1:c822ea77c7b2 | 88 | |
TETSUYA | 0:1648bb4e70e5 | 89 | pc.baud(115200); |
TETSUYA | 4:ed062dc75c52 | 90 | //RESJMP: |
TETSUYA | 0:1648bb4e70e5 | 91 | //pc.printf("Camera resetting..\r\n"); |
TETSUYA | 0:1648bb4e70e5 | 92 | camera.Reset(); |
TETSUYA | 0:1648bb4e70e5 | 93 | |
TETSUYA | 0:1648bb4e70e5 | 94 | //pc.printf("Before Init...\r\n"); |
TETSUYA | 0:1648bb4e70e5 | 95 | //camera.PrintRegister(); |
TETSUYA | 0:1648bb4e70e5 | 96 | switch( color_format ){ |
TETSUYA | 0:1648bb4e70e5 | 97 | case '1': |
TETSUYA | 0:1648bb4e70e5 | 98 | camera.InitRGB444(); |
TETSUYA | 0:1648bb4e70e5 | 99 | break; |
TETSUYA | 0:1648bb4e70e5 | 100 | case '2': |
TETSUYA | 0:1648bb4e70e5 | 101 | camera.InitRGB555(); |
TETSUYA | 0:1648bb4e70e5 | 102 | break; |
TETSUYA | 0:1648bb4e70e5 | 103 | default: |
TETSUYA | 0:1648bb4e70e5 | 104 | camera.InitRGB565(); |
TETSUYA | 0:1648bb4e70e5 | 105 | break; |
TETSUYA | 0:1648bb4e70e5 | 106 | } |
TETSUYA | 0:1648bb4e70e5 | 107 | |
TETSUYA | 0:1648bb4e70e5 | 108 | //sizex = 160; |
TETSUYA | 0:1648bb4e70e5 | 109 | //sizey = 120; |
TETSUYA | 0:1648bb4e70e5 | 110 | camera.InitQQVGA(); |
TETSUYA | 0:1648bb4e70e5 | 111 | |
TETSUYA | 0:1648bb4e70e5 | 112 | camera.InitForFIFOWriteReset(); |
TETSUYA | 0:1648bb4e70e5 | 113 | camera.InitDefaultReg(true, true); // flipv/flipH |
TETSUYA | 0:1648bb4e70e5 | 114 | |
TETSUYA | 0:1648bb4e70e5 | 115 | //pc.printf("After Init...\r\n"); |
TETSUYA | 0:1648bb4e70e5 | 116 | //camera.PrintRegister(); |
TETSUYA | 3:8d5594ce5b00 | 117 | SearchNewFileNo(); |
TETSUYA | 3:8d5594ce5b00 | 118 | |
TETSUYA | 0:1648bb4e70e5 | 119 | |
TETSUYA | 0:1648bb4e70e5 | 120 | // CAPTURE and SEND LOOP |
TETSUYA | 0:1648bb4e70e5 | 121 | while(1) |
TETSUYA | 0:1648bb4e70e5 | 122 | { |
TETSUYA | 1:c822ea77c7b2 | 123 | memset( &AreaDiff[face_bank], '\0', sizeof(AreaDiff[face_bank])); |
TETSUYA | 2:3aed552f3385 | 124 | if ( Dbmode ){ |
TETSUYA | 4:ed062dc75c52 | 125 | pc.printf("Debug Mode [d][s] Any Charactor is Capture Start! \r\n") ; |
TETSUYA | 2:3aed552f3385 | 126 | while(!pc.readable()) ; |
TETSUYA | 2:3aed552f3385 | 127 | c = pc.getc() ; |
TETSUYA | 4:ed062dc75c52 | 128 | /* |
TETSUYA | 2:3aed552f3385 | 129 | if (( c == '1' )|| ( c == '2' )||( c == '3' )){ |
TETSUYA | 2:3aed552f3385 | 130 | color_format = c; |
TETSUYA | 2:3aed552f3385 | 131 | goto RESJMP; |
TETSUYA | 3:8d5594ce5b00 | 132 | }else if ( ( c== 'm')||( c== 'M')) { |
TETSUYA | 3:8d5594ce5b00 | 133 | UseMedian = 1; |
TETSUYA | 3:8d5594ce5b00 | 134 | continue; |
TETSUYA | 3:8d5594ce5b00 | 135 | }else if ( ( c== 'n')||( c== 'N')) { |
TETSUYA | 3:8d5594ce5b00 | 136 | UseMedian = 0; |
TETSUYA | 3:8d5594ce5b00 | 137 | continue; |
TETSUYA | 4:ed062dc75c52 | 138 | }else |
TETSUYA | 4:ed062dc75c52 | 139 | */ |
TETSUYA | 4:ed062dc75c52 | 140 | if (( c == 'd' )|| ( c == 'D' )){ |
TETSUYA | 4:ed062dc75c52 | 141 | Dbmode = 0; // GO FreeRun |
TETSUYA | 4:ed062dc75c52 | 142 | continue; |
TETSUYA | 3:8d5594ce5b00 | 143 | }else if ( ( c== 's')||( c== 'S')) { |
TETSUYA | 4:ed062dc75c52 | 144 | SaveBMP(COLORS); |
TETSUYA | 3:8d5594ce5b00 | 145 | continue; |
TETSUYA | 2:3aed552f3385 | 146 | } |
TETSUYA | 2:3aed552f3385 | 147 | }else{ |
TETSUYA | 2:3aed552f3385 | 148 | if ( pc.readable()) { |
TETSUYA | 2:3aed552f3385 | 149 | c = pc.getc() ; |
TETSUYA | 2:3aed552f3385 | 150 | if (( c == 'd' )|| ( c == 'D' )){ |
TETSUYA | 2:3aed552f3385 | 151 | Dbmode = 1; // GO DEBUGmode |
TETSUYA | 2:3aed552f3385 | 152 | continue; |
TETSUYA | 4:ed062dc75c52 | 153 | } |
TETSUYA | 4:ed062dc75c52 | 154 | /* |
TETSUYA | 4:ed062dc75c52 | 155 | else if ( ( c== 'm')||( c== 'M')) { |
TETSUYA | 3:8d5594ce5b00 | 156 | UseMedian = 1; |
TETSUYA | 3:8d5594ce5b00 | 157 | continue; |
TETSUYA | 3:8d5594ce5b00 | 158 | }else if ( ( c== 'n')||( c== 'N')) { |
TETSUYA | 3:8d5594ce5b00 | 159 | UseMedian = 0; |
TETSUYA | 3:8d5594ce5b00 | 160 | continue; |
TETSUYA | 2:3aed552f3385 | 161 | } |
TETSUYA | 4:ed062dc75c52 | 162 | */ |
TETSUYA | 2:3aed552f3385 | 163 | } |
TETSUYA | 2:3aed552f3385 | 164 | pc.printf(" \r\n") ; |
TETSUYA | 0:1648bb4e70e5 | 165 | } |
TETSUYA | 0:1648bb4e70e5 | 166 | camera.CaptureNext(); // sample start! |
TETSUYA | 0:1648bb4e70e5 | 167 | while(camera.CaptureDone() == false); |
TETSUYA | 0:1648bb4e70e5 | 168 | camera.ReadStart(); |
TETSUYA | 0:1648bb4e70e5 | 169 | pixc = 0; |
TETSUYA | 1:c822ea77c7b2 | 170 | ay = 0; |
TETSUYA | 0:1648bb4e70e5 | 171 | for (int y = 0;y < SIZEY;y++) { |
TETSUYA | 1:c822ea77c7b2 | 172 | ay = y / AREA_Y; |
TETSUYA | 0:1648bb4e70e5 | 173 | for (int x = 0;x < SIZEX;x++) { |
TETSUYA | 0:1648bb4e70e5 | 174 | d1 = camera.ReadOneByte() ; // upper nibble is XXX , lower nibble is B |
TETSUYA | 0:1648bb4e70e5 | 175 | d2 = camera.ReadOneByte() ; // upper nibble is G , lower nibble is R |
TETSUYA | 0:1648bb4e70e5 | 176 | pixel = ((unsigned int)d2 << 8) + ((unsigned int)d1 & 0xff); |
TETSUYA | 1:c822ea77c7b2 | 177 | |
TETSUYA | 1:c822ea77c7b2 | 178 | // Make GrayScale |
TETSUYA | 1:c822ea77c7b2 | 179 | // make 6bit Code on Each Color |
TETSUYA | 1:c822ea77c7b2 | 180 | sort[0] = ((pixel >> 11) & 0x1f)<<1; // r |
TETSUYA | 1:c822ea77c7b2 | 181 | sort[1] = ((pixel >> 5) & 0x3f); // g |
TETSUYA | 1:c822ea77c7b2 | 182 | sort[2] = ((pixel ) & 0x1f)<<1; // b |
TETSUYA | 1:c822ea77c7b2 | 183 | |
TETSUYA | 1:c822ea77c7b2 | 184 | int max = 0, min = 0xffff; |
TETSUYA | 1:c822ea77c7b2 | 185 | for (int i=0;i<3;i++){ |
TETSUYA | 1:c822ea77c7b2 | 186 | if (sort[i] > max) max = sort[i]; |
TETSUYA | 1:c822ea77c7b2 | 187 | if (sort[i] < min) min = sort[i]; |
TETSUYA | 1:c822ea77c7b2 | 188 | } |
TETSUYA | 1:c822ea77c7b2 | 189 | int gray = ((max + min) / 2) ; |
TETSUYA | 1:c822ea77c7b2 | 190 | |
TETSUYA | 1:c822ea77c7b2 | 191 | pixelg = ((gray>>1)<<11) + (gray<<5) + (gray>>1); |
TETSUYA | 1:c822ea77c7b2 | 192 | pixel = pixelg; |
TETSUYA | 2:3aed552f3385 | 193 | canvas[x][y] = (char)( gray ) & 0x3f; // 6bit gray scale |
TETSUYA | 1:c822ea77c7b2 | 194 | |
TETSUYA | 1:c822ea77c7b2 | 195 | // Make Difference AreaData |
TETSUYA | 2:3aed552f3385 | 196 | AreaDiff[face_bank][x/AREA_X][ay] += ( gray ); // 6bit scaler! |
TETSUYA | 1:c822ea77c7b2 | 197 | |
TETSUYA | 2:3aed552f3385 | 198 | if ( Dbmode ){ |
TETSUYA | 2:3aed552f3385 | 199 | // send <CRLF> and Count on each 16dot. |
TETSUYA | 2:3aed552f3385 | 200 | if ( !(x%16) ){ |
TETSUYA | 2:3aed552f3385 | 201 | pc.printf("\r\n%04x: ",pixc ) ; |
TETSUYA | 2:3aed552f3385 | 202 | pixc +=16; |
TETSUYA | 2:3aed552f3385 | 203 | } |
TETSUYA | 2:3aed552f3385 | 204 | pc.printf("%04x ",pixel) ; |
TETSUYA | 0:1648bb4e70e5 | 205 | } |
TETSUYA | 0:1648bb4e70e5 | 206 | } |
TETSUYA | 0:1648bb4e70e5 | 207 | } |
TETSUYA | 0:1648bb4e70e5 | 208 | camera.ReadStop(); |
TETSUYA | 3:8d5594ce5b00 | 209 | /* |
TETSUYA | 3:8d5594ce5b00 | 210 | if ( UseMedian ){ |
TETSUYA | 3:8d5594ce5b00 | 211 | MedianFilter(); |
TETSUYA | 3:8d5594ce5b00 | 212 | } |
TETSUYA | 3:8d5594ce5b00 | 213 | */ |
TETSUYA | 1:c822ea77c7b2 | 214 | |
TETSUYA | 1:c822ea77c7b2 | 215 | // Difference Check!! |
TETSUYA | 1:c822ea77c7b2 | 216 | pc.printf("\r\n" ) ; |
TETSUYA | 2:3aed552f3385 | 217 | |
TETSUYA | 2:3aed552f3385 | 218 | int err_c=0; |
TETSUYA | 1:c822ea77c7b2 | 219 | int backArea = ( face_bank + 1 )&0x01; |
TETSUYA | 2:3aed552f3385 | 220 | for (int y = 0; y < AREA_DIV_Y; y++) { |
TETSUYA | 2:3aed552f3385 | 221 | if ( Dbmode ) pc.printf("Diff: " ) ; |
TETSUYA | 2:3aed552f3385 | 222 | |
TETSUYA | 2:3aed552f3385 | 223 | for (int x = 0; x < AREA_DIV_X; x++) { |
TETSUYA | 1:c822ea77c7b2 | 224 | int dif = abs( AreaDiff[backArea][x][y] - AreaDiff[face_bank][x][y] ); |
TETSUYA | 2:3aed552f3385 | 225 | if (dif >= AREA_THRESH) { |
TETSUYA | 2:3aed552f3385 | 226 | err_c++; // Error Count |
TETSUYA | 2:3aed552f3385 | 227 | |
TETSUYA | 3:8d5594ce5b00 | 228 | if ( Dbmode ) pc.printf("X%6d " , dif) ; |
TETSUYA | 1:c822ea77c7b2 | 229 | }else{ |
TETSUYA | 3:8d5594ce5b00 | 230 | if ( Dbmode ) pc.printf("O%6d " , dif) ; |
TETSUYA | 1:c822ea77c7b2 | 231 | } |
TETSUYA | 1:c822ea77c7b2 | 232 | } |
TETSUYA | 2:3aed552f3385 | 233 | if ( Dbmode ) { |
TETSUYA | 3:8d5594ce5b00 | 234 | pc.printf(" " ) ; |
TETSUYA | 2:3aed552f3385 | 235 | pc.printf(" \r\n" ) ; |
TETSUYA | 2:3aed552f3385 | 236 | } |
TETSUYA | 1:c822ea77c7b2 | 237 | } |
TETSUYA | 2:3aed552f3385 | 238 | int led_s =0; |
TETSUYA | 2:3aed552f3385 | 239 | switch ( err_c ){ |
TETSUYA | 2:3aed552f3385 | 240 | case 1: |
TETSUYA | 2:3aed552f3385 | 241 | led_s =1; |
TETSUYA | 2:3aed552f3385 | 242 | break; |
TETSUYA | 2:3aed552f3385 | 243 | case 2: |
TETSUYA | 2:3aed552f3385 | 244 | led_s =3; |
TETSUYA | 2:3aed552f3385 | 245 | break; |
TETSUYA | 2:3aed552f3385 | 246 | case 3: |
TETSUYA | 2:3aed552f3385 | 247 | led_s =7; |
TETSUYA | 2:3aed552f3385 | 248 | break; |
TETSUYA | 2:3aed552f3385 | 249 | default: |
TETSUYA | 2:3aed552f3385 | 250 | if ( err_c >= 3) { |
TETSUYA | 2:3aed552f3385 | 251 | led_s =7; |
TETSUYA | 2:3aed552f3385 | 252 | }else{ |
TETSUYA | 2:3aed552f3385 | 253 | led_s =0; |
TETSUYA | 2:3aed552f3385 | 254 | } |
TETSUYA | 2:3aed552f3385 | 255 | break; |
TETSUYA | 2:3aed552f3385 | 256 | } |
TETSUYA | 2:3aed552f3385 | 257 | |
TETSUYA | 2:3aed552f3385 | 258 | led_s |= ( face_bank )? 0x08 : 0x00 ; |
TETSUYA | 2:3aed552f3385 | 259 | myleds = led_s ; |
TETSUYA | 2:3aed552f3385 | 260 | if ( err_c >= 3 ){ |
TETSUYA | 2:3aed552f3385 | 261 | //pc.printf("\r\n") ; |
TETSUYA | 3:8d5594ce5b00 | 262 | if ( Dbmode ){ |
TETSUYA | 3:8d5594ce5b00 | 263 | pixc = 0; |
TETSUYA | 3:8d5594ce5b00 | 264 | for (int y = 0;y < SIZEY;y++) { |
TETSUYA | 3:8d5594ce5b00 | 265 | for (int x = 0;x < SIZEX;x++) { |
TETSUYA | 3:8d5594ce5b00 | 266 | char gray = 0; |
TETSUYA | 3:8d5594ce5b00 | 267 | gray = canvas[x][y]; |
TETSUYA | 3:8d5594ce5b00 | 268 | pixel = ((gray>>1)<<11) + (gray<<5) + (gray>>1); |
TETSUYA | 3:8d5594ce5b00 | 269 | |
TETSUYA | 3:8d5594ce5b00 | 270 | // send <CRLF> and Count on each 16dot. |
TETSUYA | 3:8d5594ce5b00 | 271 | if ( !(x%16) ){ |
TETSUYA | 3:8d5594ce5b00 | 272 | pc.printf("\r\n%04x: ",pixc ) ; |
TETSUYA | 3:8d5594ce5b00 | 273 | pixc +=16; |
TETSUYA | 3:8d5594ce5b00 | 274 | } |
TETSUYA | 3:8d5594ce5b00 | 275 | pc.printf("%04x ",pixel) ; |
TETSUYA | 2:3aed552f3385 | 276 | } |
TETSUYA | 2:3aed552f3385 | 277 | } |
TETSUYA | 2:3aed552f3385 | 278 | } |
TETSUYA | 4:ed062dc75c52 | 279 | SaveBMP(COLORS); |
TETSUYA | 3:8d5594ce5b00 | 280 | |
TETSUYA | 2:3aed552f3385 | 281 | } |
TETSUYA | 2:3aed552f3385 | 282 | face_bank++; |
TETSUYA | 2:3aed552f3385 | 283 | face_bank&=0x01; |
TETSUYA | 2:3aed552f3385 | 284 | |
TETSUYA | 2:3aed552f3385 | 285 | |
TETSUYA | 2:3aed552f3385 | 286 | //pc.printf("\r\n") ; |
TETSUYA | 2:3aed552f3385 | 287 | } |
TETSUYA | 2:3aed552f3385 | 288 | } |
TETSUYA | 2:3aed552f3385 | 289 | |
TETSUYA | 3:8d5594ce5b00 | 290 | void MedianFilter(void) |
TETSUYA | 3:8d5594ce5b00 | 291 | { |
TETSUYA | 3:8d5594ce5b00 | 292 | int sortM[9] = { 0 }; |
TETSUYA | 3:8d5594ce5b00 | 293 | int p; |
TETSUYA | 3:8d5594ce5b00 | 294 | int ay; |
TETSUYA | 2:3aed552f3385 | 295 | |
TETSUYA | 3:8d5594ce5b00 | 296 | // Median Filter |
TETSUYA | 3:8d5594ce5b00 | 297 | memset( &AreaDiff[face_bank], '\0', sizeof(AreaDiff[face_bank])); |
TETSUYA | 3:8d5594ce5b00 | 298 | ay = 0; |
TETSUYA | 3:8d5594ce5b00 | 299 | for (int y = 1;y < SIZEY-1;y++) { |
TETSUYA | 3:8d5594ce5b00 | 300 | for (int x = 1;x < SIZEX-1;x++) { |
TETSUYA | 3:8d5594ce5b00 | 301 | p=0; |
TETSUYA | 1:c822ea77c7b2 | 302 | |
TETSUYA | 3:8d5594ce5b00 | 303 | // Get Around Pixels |
TETSUYA | 3:8d5594ce5b00 | 304 | for (int k = -1; k < 2; k++) { |
TETSUYA | 3:8d5594ce5b00 | 305 | for (int j = -1; j < 2; j++) { |
TETSUYA | 3:8d5594ce5b00 | 306 | sortM[p++] = canvas[x+j][y+k]; //grayscale data |
TETSUYA | 1:c822ea77c7b2 | 307 | } |
TETSUYA | 3:8d5594ce5b00 | 308 | } |
TETSUYA | 3:8d5594ce5b00 | 309 | // sort now... |
TETSUYA | 3:8d5594ce5b00 | 310 | for (int k = 0; k < 8; k++){ |
TETSUYA | 3:8d5594ce5b00 | 311 | for (int j = 8; j > k; j--) { |
TETSUYA | 3:8d5594ce5b00 | 312 | if (sortM[j] < sortM[j - 1]) { |
TETSUYA | 3:8d5594ce5b00 | 313 | int dmy = sortM[j]; |
TETSUYA | 3:8d5594ce5b00 | 314 | sortM[j] = sortM[j - 1]; |
TETSUYA | 3:8d5594ce5b00 | 315 | sortM[j - 1] = dmy; |
TETSUYA | 1:c822ea77c7b2 | 316 | } |
TETSUYA | 1:c822ea77c7b2 | 317 | } |
TETSUYA | 3:8d5594ce5b00 | 318 | } |
TETSUYA | 1:c822ea77c7b2 | 319 | |
TETSUYA | 3:8d5594ce5b00 | 320 | canvas[x][y] = sortM[4]; // Center Data! |
TETSUYA | 3:8d5594ce5b00 | 321 | AreaDiff[face_bank][x/AREA_X][ay] += ( canvas[x][y] ); // 6bit scaler! |
TETSUYA | 3:8d5594ce5b00 | 322 | } |
TETSUYA | 3:8d5594ce5b00 | 323 | } |
TETSUYA | 3:8d5594ce5b00 | 324 | } |
TETSUYA | 3:8d5594ce5b00 | 325 | |
TETSUYA | 4:ed062dc75c52 | 326 | char *filebase = "/local/Bmap"; |
TETSUYA | 4:ed062dc75c52 | 327 | //char *filebase = "/sd/Bmap"; |
TETSUYA | 3:8d5594ce5b00 | 328 | |
TETSUYA | 3:8d5594ce5b00 | 329 | void SearchNewFileNo() |
TETSUYA | 3:8d5594ce5b00 | 330 | { |
TETSUYA | 3:8d5594ce5b00 | 331 | FILE *fp; |
TETSUYA | 3:8d5594ce5b00 | 332 | char filename[30] ; |
TETSUYA | 3:8d5594ce5b00 | 333 | while( 1 ){ |
TETSUYA | 3:8d5594ce5b00 | 334 | sprintf( filename, "%s%04d.bmp", filebase , FileNo); |
TETSUYA | 3:8d5594ce5b00 | 335 | if((fp = fopen(filename, "rb")) == NULL){ |
TETSUYA | 3:8d5594ce5b00 | 336 | pc.printf("%s is not Exist.", filename); |
TETSUYA | 3:8d5594ce5b00 | 337 | return ; |
TETSUYA | 3:8d5594ce5b00 | 338 | }else{ |
TETSUYA | 3:8d5594ce5b00 | 339 | pc.printf("%s is Exist. Increment no...", filename); |
TETSUYA | 3:8d5594ce5b00 | 340 | fclose(fp); |
TETSUYA | 3:8d5594ce5b00 | 341 | FileNo++; |
TETSUYA | 1:c822ea77c7b2 | 342 | } |
TETSUYA | 3:8d5594ce5b00 | 343 | } |
TETSUYA | 3:8d5594ce5b00 | 344 | |
TETSUYA | 3:8d5594ce5b00 | 345 | |
TETSUYA | 3:8d5594ce5b00 | 346 | |
TETSUYA | 3:8d5594ce5b00 | 347 | } |
TETSUYA | 3:8d5594ce5b00 | 348 | |
TETSUYA | 4:ed062dc75c52 | 349 | //flag 24: 24bit Clolr 8:8itGrayScale |
TETSUYA | 4:ed062dc75c52 | 350 | void SaveBMP(int flag) |
TETSUYA | 3:8d5594ce5b00 | 351 | { |
TETSUYA | 3:8d5594ce5b00 | 352 | unsigned char gray8; |
TETSUYA | 3:8d5594ce5b00 | 353 | unsigned char bmp_line_data[SIZEX*3]; //画像1行分のRGB情報を格納する |
TETSUYA | 4:ed062dc75c52 | 354 | unsigned char RGBQUAD[4]; //Palette Data |
TETSUYA | 3:8d5594ce5b00 | 355 | int back ; |
TETSUYA | 3:8d5594ce5b00 | 356 | FILE *fp; |
TETSUYA | 3:8d5594ce5b00 | 357 | char filename[30] ; |
TETSUYA | 4:ed062dc75c52 | 358 | |
TETSUYA | 3:8d5594ce5b00 | 359 | sprintf( filename, "%s%04d.bmp", filebase , FileNo); |
TETSUYA | 3:8d5594ce5b00 | 360 | FileNo++; |
TETSUYA | 3:8d5594ce5b00 | 361 | back = myleds; |
TETSUYA | 3:8d5594ce5b00 | 362 | |
TETSUYA | 3:8d5594ce5b00 | 363 | myleds = 0xff; |
TETSUYA | 3:8d5594ce5b00 | 364 | if((fp = fopen(filename, "wb")) == NULL){ |
TETSUYA | 3:8d5594ce5b00 | 365 | pc.printf("Error: %s could not open.", filename); |
TETSUYA | 3:8d5594ce5b00 | 366 | return ; |
TETSUYA | 3:8d5594ce5b00 | 367 | } |
TETSUYA | 0:1648bb4e70e5 | 368 | |
TETSUYA | 3:8d5594ce5b00 | 369 | // Make BITMAPHEADER to FileHead. |
TETSUYA | 3:8d5594ce5b00 | 370 | create_header(fp, SIZEX, SIZEY); |
TETSUYA | 3:8d5594ce5b00 | 371 | |
TETSUYA | 4:ed062dc75c52 | 372 | if ( flag==8 ){ |
TETSUYA | 4:ed062dc75c52 | 373 | // if 8bit Gray Scale , Make Palette Data |
TETSUYA | 4:ed062dc75c52 | 374 | for (int i=0;i<256;i++){ |
TETSUYA | 4:ed062dc75c52 | 375 | RGBQUAD[0] = i; // |
TETSUYA | 4:ed062dc75c52 | 376 | RGBQUAD[1] = i; |
TETSUYA | 4:ed062dc75c52 | 377 | RGBQUAD[2] = i; |
TETSUYA | 4:ed062dc75c52 | 378 | RGBQUAD[3] = 0; |
TETSUYA | 4:ed062dc75c52 | 379 | fwrite(RGBQUAD, sizeof(RGBQUAD), 1, fp); |
TETSUYA | 4:ed062dc75c52 | 380 | } |
TETSUYA | 4:ed062dc75c52 | 381 | } |
TETSUYA | 4:ed062dc75c52 | 382 | |
TETSUYA | 3:8d5594ce5b00 | 383 | for (int y=0; y<SIZEY; y++) { |
TETSUYA | 4:ed062dc75c52 | 384 | if ( flag==24 ){ |
TETSUYA | 4:ed062dc75c52 | 385 | for (int x=0; x<SIZEX; x++) { |
TETSUYA | 4:ed062dc75c52 | 386 | // RGB888 |
TETSUYA | 4:ed062dc75c52 | 387 | gray8 = (unsigned char)(canvas[x][y] << 2); //grayscale data 6bit |
TETSUYA | 4:ed062dc75c52 | 388 | |
TETSUYA | 4:ed062dc75c52 | 389 | bmp_line_data[x*3] = (unsigned char)gray8; // b |
TETSUYA | 4:ed062dc75c52 | 390 | bmp_line_data[x*3 + 1] = (unsigned char)gray8; // g |
TETSUYA | 4:ed062dc75c52 | 391 | bmp_line_data[x*3 + 2] = (unsigned char)gray8; // r |
TETSUYA | 4:ed062dc75c52 | 392 | } |
TETSUYA | 4:ed062dc75c52 | 393 | fwrite(bmp_line_data, sizeof(unsigned char), sizeof(bmp_line_data), fp); |
TETSUYA | 4:ed062dc75c52 | 394 | }else{ |
TETSUYA | 4:ed062dc75c52 | 395 | // GrayScale |
TETSUYA | 4:ed062dc75c52 | 396 | for (int x=0; x<SIZEX; x++) { |
TETSUYA | 4:ed062dc75c52 | 397 | gray8 = (unsigned char)(canvas[x][y] << 2); //grayscale data 6bit |
TETSUYA | 4:ed062dc75c52 | 398 | fwrite(&gray8 , 1, 1, fp); |
TETSUYA | 4:ed062dc75c52 | 399 | } |
TETSUYA | 3:8d5594ce5b00 | 400 | } |
TETSUYA | 3:8d5594ce5b00 | 401 | } |
TETSUYA | 3:8d5594ce5b00 | 402 | fclose(fp); |
TETSUYA | 3:8d5594ce5b00 | 403 | |
TETSUYA | 3:8d5594ce5b00 | 404 | myleds = back ; |
TETSUYA | 3:8d5594ce5b00 | 405 | } |
TETSUYA | 3:8d5594ce5b00 | 406 | |
TETSUYA | 0:1648bb4e70e5 | 407 | |
TETSUYA | 0:1648bb4e70e5 | 408 | int create_header(FILE *fp, int width, int height) { |
TETSUYA | 0:1648bb4e70e5 | 409 | int real_width; |
TETSUYA | 0:1648bb4e70e5 | 410 | unsigned char header_buf[HEADERSIZE]; //ヘッダを格納する |
TETSUYA | 0:1648bb4e70e5 | 411 | unsigned int file_size; |
TETSUYA | 0:1648bb4e70e5 | 412 | unsigned int offset_to_data; |
TETSUYA | 0:1648bb4e70e5 | 413 | unsigned long info_header_size; |
TETSUYA | 0:1648bb4e70e5 | 414 | unsigned int planes; |
TETSUYA | 0:1648bb4e70e5 | 415 | unsigned int color; |
TETSUYA | 0:1648bb4e70e5 | 416 | unsigned long compress; |
TETSUYA | 0:1648bb4e70e5 | 417 | unsigned long data_size; |
TETSUYA | 0:1648bb4e70e5 | 418 | long xppm; |
TETSUYA | 0:1648bb4e70e5 | 419 | long yppm; |
TETSUYA | 0:1648bb4e70e5 | 420 | |
TETSUYA | 0:1648bb4e70e5 | 421 | real_width = width*3 + width%4; |
TETSUYA | 0:1648bb4e70e5 | 422 | |
TETSUYA | 0:1648bb4e70e5 | 423 | //ここからヘッダ作成 |
TETSUYA | 0:1648bb4e70e5 | 424 | file_size = height * real_width + HEADERSIZE; |
TETSUYA | 4:ed062dc75c52 | 425 | |
TETSUYA | 0:1648bb4e70e5 | 426 | offset_to_data = HEADERSIZE; |
TETSUYA | 4:ed062dc75c52 | 427 | if ( COLORS == 8 ) { |
TETSUYA | 4:ed062dc75c52 | 428 | offset_to_data += 256 * 4; |
TETSUYA | 4:ed062dc75c52 | 429 | } |
TETSUYA | 4:ed062dc75c52 | 430 | |
TETSUYA | 0:1648bb4e70e5 | 431 | info_header_size = INFOHEADERSIZE; |
TETSUYA | 0:1648bb4e70e5 | 432 | planes = 1; |
TETSUYA | 4:ed062dc75c52 | 433 | color = COLORS; // 24; |
TETSUYA | 0:1648bb4e70e5 | 434 | compress = 0; |
TETSUYA | 0:1648bb4e70e5 | 435 | data_size = height * real_width; |
TETSUYA | 0:1648bb4e70e5 | 436 | xppm = 1; |
TETSUYA | 0:1648bb4e70e5 | 437 | yppm = 1; |
TETSUYA | 0:1648bb4e70e5 | 438 | |
TETSUYA | 0:1648bb4e70e5 | 439 | header_buf[0] = 'B'; |
TETSUYA | 0:1648bb4e70e5 | 440 | header_buf[1] = 'M'; |
TETSUYA | 0:1648bb4e70e5 | 441 | memcpy(header_buf + 2, &file_size, sizeof(file_size)); |
TETSUYA | 0:1648bb4e70e5 | 442 | header_buf[6] = 0; |
TETSUYA | 0:1648bb4e70e5 | 443 | header_buf[7] = 0; |
TETSUYA | 0:1648bb4e70e5 | 444 | header_buf[8] = 0; |
TETSUYA | 0:1648bb4e70e5 | 445 | header_buf[9] = 0; |
TETSUYA | 0:1648bb4e70e5 | 446 | memcpy(header_buf + 10, &offset_to_data, sizeof(offset_to_data)); |
TETSUYA | 0:1648bb4e70e5 | 447 | memcpy(header_buf + 14, &info_header_size, sizeof(info_header_size)); |
TETSUYA | 0:1648bb4e70e5 | 448 | memcpy(header_buf + 18, &width, sizeof(width)); |
TETSUYA | 0:1648bb4e70e5 | 449 | height = height * -1; // データ格納順が逆なので、高さをマイナスとしている |
TETSUYA | 0:1648bb4e70e5 | 450 | memcpy(header_buf + 22, &height, sizeof(height)); |
TETSUYA | 0:1648bb4e70e5 | 451 | memcpy(header_buf + 26, &planes, sizeof(planes)); |
TETSUYA | 0:1648bb4e70e5 | 452 | memcpy(header_buf + 28, &color, sizeof(color)); |
TETSUYA | 0:1648bb4e70e5 | 453 | memcpy(header_buf + 30, &compress, sizeof(compress)); |
TETSUYA | 0:1648bb4e70e5 | 454 | memcpy(header_buf + 34, &data_size, sizeof(data_size)); |
TETSUYA | 0:1648bb4e70e5 | 455 | memcpy(header_buf + 38, &xppm, sizeof(xppm)); |
TETSUYA | 0:1648bb4e70e5 | 456 | memcpy(header_buf + 42, &yppm, sizeof(yppm)); |
TETSUYA | 4:ed062dc75c52 | 457 | header_buf[46] = 0; // Palette Color (long) |
TETSUYA | 0:1648bb4e70e5 | 458 | header_buf[47] = 0; |
TETSUYA | 0:1648bb4e70e5 | 459 | header_buf[48] = 0; |
TETSUYA | 0:1648bb4e70e5 | 460 | header_buf[49] = 0; |
TETSUYA | 4:ed062dc75c52 | 461 | header_buf[50] = 0; // Important Color (long) |
TETSUYA | 0:1648bb4e70e5 | 462 | header_buf[51] = 0; |
TETSUYA | 0:1648bb4e70e5 | 463 | header_buf[52] = 0; |
TETSUYA | 0:1648bb4e70e5 | 464 | header_buf[53] = 0; |
TETSUYA | 0:1648bb4e70e5 | 465 | |
TETSUYA | 0:1648bb4e70e5 | 466 | //ヘッダの書き込み |
TETSUYA | 0:1648bb4e70e5 | 467 | fwrite(header_buf, sizeof(unsigned char), HEADERSIZE, fp); |
TETSUYA | 0:1648bb4e70e5 | 468 | |
TETSUYA | 0:1648bb4e70e5 | 469 | return 0; |
TETSUYA | 0:1648bb4e70e5 | 470 | } |
TETSUYA | 3:8d5594ce5b00 | 471 |