CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存
Dependencies: SDFileSystem mbed
Diff: main.cpp
- Revision:
- 3:8d5594ce5b00
- Parent:
- 2:3aed552f3385
- Child:
- 4:ed062dc75c52
diff -r 3aed552f3385 -r 8d5594ce5b00 main.cpp --- a/main.cpp Fri Sep 27 09:21:46 2013 +0000 +++ b/main.cpp Tue Oct 01 01:55:39 2013 +0000 @@ -4,10 +4,16 @@ Sadaei Osakabe ( http://mbed.org/users/diasea/ ) http://mbed.org/users/diasea/code/OV7670_with_AL422B_Color_Size_test/ +SDFileSystem +http://mbed.org/users/mbed_official/code/SDFileSystem/docs/tip/ + +mbed_debug.h +https://github.com/adamgreen/SmoothieTest/blob/master/mbed/src/capi/mbed_debug.h */ +#include "mbed.h" +#include "SDFileSystem.h" #include <string.h> #include <math.h> -#include "mbed.h" #include <algorithm> #include "ov7670.h" @@ -21,13 +27,22 @@ # define SIZEY (240) #endif +int create_header(FILE *fp, int width, int height) ; + +#define FILEHEADERSIZE 14 //ファイルヘッダのサイズ +#define INFOHEADERSIZE 40 //情報ヘッダのサイズ +#define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE) + + OV7670 camera( p28,p27, // SDA,SCL(I2C / SCCB) p25,p26,p29, // VSYNC,HREF,WEN(FIFO) p24,p23,p22,p21,p20,p19,p18,p17, // D7-D0 p5,p6,p7) ; // RRST,OE,RCLK + +SDFileSystem sd(p11, p12, p13, p14, "sd"); // mosi, miso, sclk, cs LocalFileSystem local("local"); BusOut myleds(LED1, LED2, LED3, LED4); @@ -36,19 +51,23 @@ int sizex = 0; int sizey = 0; +int FileNo = 0; #define AREA_X 32 #define AREA_Y 24 #define AREA_DIV_X 5 #define AREA_DIV_Y 5 //#define AREA_THRESH 12000 -#define AREA_THRESH 8000 +#define AREA_THRESH 5000 -char canvas[160][120] ; //18.5KB -signed int AreaDiff[2][AREA_DIV_X][AREA_DIV_Y]; // 5x5 Area = 32x24dot Each Block +char canvas[SIZEX][SIZEY] ; //18.5KB [0]gray [1]Median +signed short AreaDiff[2][AREA_DIV_X][AREA_DIV_Y]; // 5x5 Area = 32x24dot Each Block int face_bank = 0; int Dbmode = 0; +void MedianFilter(void); +void SaveBMP(void); +void SearchNewFileNo(); int main() { @@ -59,6 +78,7 @@ int pixc, pixelg; int sort[3]; int ay = 0; + char UseMedian = 0; memset( AreaDiff, '\0', sizeof(AreaDiff)); @@ -90,6 +110,8 @@ //pc.printf("After Init...\r\n"); //camera.PrintRegister(); + SearchNewFileNo(); + // CAPTURE and SEND LOOP while(1) @@ -105,6 +127,15 @@ }else if (( c == 'd' )|| ( c == 'D' )){ Dbmode = 0; // GO FreeRun continue; + }else if ( ( c== 'm')||( c== 'M')) { + UseMedian = 1; + continue; + }else if ( ( c== 'n')||( c== 'N')) { + UseMedian = 0; + continue; + }else if ( ( c== 's')||( c== 'S')) { + SaveBMP(); + continue; } }else{ if ( pc.readable()) { @@ -112,6 +143,12 @@ if (( c == 'd' )|| ( c == 'D' )){ Dbmode = 1; // GO DEBUGmode continue; + }else if ( ( c== 'm')||( c== 'M')) { + UseMedian = 1; + continue; + }else if ( ( c== 'n')||( c== 'N')) { + UseMedian = 0; + continue; } } pc.printf(" \r\n") ; @@ -158,9 +195,13 @@ pc.printf("%04x ",pixel) ; } } - } camera.ReadStop(); + /* + if ( UseMedian ){ + MedianFilter(); + } + */ // Difference Check!! pc.printf("\r\n" ) ; @@ -175,13 +216,13 @@ if (dif >= AREA_THRESH) { err_c++; // Error Count - if ( Dbmode ) pc.printf("X%5d " , dif) ; + if ( Dbmode ) pc.printf("X%6d " , dif) ; }else{ - if ( Dbmode ) pc.printf("O%5d " , dif) ; + if ( Dbmode ) pc.printf("O%6d " , dif) ; } } if ( Dbmode ) { - pc.printf(" " ) ; + pc.printf(" " ) ; pc.printf(" \r\n" ) ; } } @@ -209,21 +250,25 @@ myleds = led_s ; if ( err_c >= 3 ){ //pc.printf("\r\n") ; - pixc = 0; - for (int y = 0;y < SIZEY;y++) { - for (int x = 0;x < SIZEX;x++) { - char gray = 0; - gray = canvas[x][y]; - pixel = ((gray>>1)<<11) + (gray<<5) + (gray>>1); - - // send <CRLF> and Count on each 16dot. - if ( !(x%16) ){ - pc.printf("\r\n%04x: ",pixc ) ; - pixc +=16; + if ( Dbmode ){ + pixc = 0; + for (int y = 0;y < SIZEY;y++) { + for (int x = 0;x < SIZEX;x++) { + char gray = 0; + gray = canvas[x][y]; + pixel = ((gray>>1)<<11) + (gray<<5) + (gray>>1); + + // send <CRLF> and Count on each 16dot. + if ( !(x%16) ){ + pc.printf("\r\n%04x: ",pixc ) ; + pixc +=16; + } + pc.printf("%04x ",pixel) ; } - pc.printf("%04x ",pixel) ; } } + SaveBMP(); + } face_bank++; face_bank&=0x01; @@ -233,62 +278,102 @@ } } - +void MedianFilter(void) +{ + int sortM[9] = { 0 }; + int p; + int ay; -/* - // Median Filter - for (int y = 1;y < SIZEY-1;y++) { - for (int x = 1;x < SIZEX-1;x++) { - int sortM[9] = { 0 }; - int p=0; + // Median Filter + memset( &AreaDiff[face_bank], '\0', sizeof(AreaDiff[face_bank])); + ay = 0; + for (int y = 1;y < SIZEY-1;y++) { + for (int x = 1;x < SIZEX-1;x++) { + p=0; - // Get Around Pixels - for (int k = -1; k < 2; k++) { - for (int j = -1; j < 2; j++) { - sortM[p++] = canvas[x+j][y+k]; //grayscale data - } + // Get Around Pixels + for (int k = -1; k < 2; k++) { + for (int j = -1; j < 2; j++) { + sortM[p++] = canvas[x+j][y+k]; //grayscale data } - // sort now... - for (int k = 0; k < 8; k++){ - for (int j = 8; j > k; j--) { - if (sortM[j] < sortM[j - 1]) { - int dmy = sortM[j]; - sortM[j] = sortM[j - 1]; - sortM[j - 1] = dmy; - } + } + // sort now... + for (int k = 0; k < 8; k++){ + for (int j = 8; j > k; j--) { + if (sortM[j] < sortM[j - 1]) { + int dmy = sortM[j]; + sortM[j] = sortM[j - 1]; + sortM[j - 1] = dmy; } } + } - canvasM[x][y] = sortM[4]; // Center Data! - } + canvas[x][y] = sortM[4]; // Center Data! + AreaDiff[face_bank][x/AREA_X][ay] += ( canvas[x][y] ); // 6bit scaler! + } + } +} + +//char *filebase = "/local/Bmap"; +char *filebase = "/sd/Bmap"; + +void SearchNewFileNo() +{ + FILE *fp; + char filename[30] ; + while( 1 ){ + sprintf( filename, "%s%04d.bmp", filebase , FileNo); + if((fp = fopen(filename, "rb")) == NULL){ + pc.printf("%s is not Exist.", filename); + return ; + }else{ + pc.printf("%s is Exist. Increment no...", filename); + fclose(fp); + FileNo++; } - - // Send Median Display - pixc = 0; - for (int y = 0;y < SIZEY;y++) { - for (int x = 0;x < SIZEX;x++) { - // send <CRLF> and Count on each 16dot. - if ( !(x%16) ){ - pc.printf("\r\n%04x: ",pixc ) ; - pixc +=16; - } - pc.printf("%04x ",canvasM[x][y]) ; - } - } + } + + + +} + +void SaveBMP(void) +{ + unsigned char gray8; + unsigned char bmp_line_data[SIZEX*3]; //画像1行分のRGB情報を格納する + int back ; + FILE *fp; + char filename[30] ; -*/ -/* -int create_header(FILE *fp, int width, int height) ; + sprintf( filename, "%s%04d.bmp", filebase , FileNo); + FileNo++; + back = myleds; + + myleds = 0xff; + if((fp = fopen(filename, "wb")) == NULL){ + pc.printf("Error: %s could not open.", filename); + return ; + } -#if defined(BITMAPFILE) || defined(BAYERBITMAPFILE) -#define BITMAPFILE -#undef BAYERBITMAPFILE -#undef HEXFILE -#undef COLORBAR + // Make BITMAPHEADER to FileHead. + create_header(fp, SIZEX, SIZEY); + + for (int y=0; y<SIZEY; y++) { + for (int x=0; x<SIZEX; x++) { + // RGB888 + gray8 = (unsigned char)(canvas[x][y] << 2); //grayscale data 6bit -#define FILEHEADERSIZE 14 //ファイルヘッダのサイズ -#define INFOHEADERSIZE 40 //情報ヘッダのサイズ -#define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE) + bmp_line_data[x*3] = (unsigned char)gray8; // b + bmp_line_data[x*3 + 1] = (unsigned char)gray8; // g + bmp_line_data[x*3 + 2] = (unsigned char)gray8; // r + } + fwrite(bmp_line_data, sizeof(unsigned char), sizeof(bmp_line_data), fp); + } + fclose(fp); + + myleds = back ; +} + int create_header(FILE *fp, int width, int height) { int real_width; @@ -348,5 +433,4 @@ return 0; } -#endif -*/ +