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

Dependencies:   SDFileSystem mbed

Revision:
3:8d5594ce5b00
Parent:
2:3aed552f3385
Child:
4:ed062dc75c52
--- 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
-*/
+