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