CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存

Dependencies:   SDFileSystem mbed

Committer:
TETSUYA
Date:
Tue Feb 04 05:42:17 2014 +0000
Revision:
4:ed062dc75c52
Parent:
3:8d5594ce5b00
???????

Who changed what in which revision?

UserRevisionLine numberNew 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