1+ #include " SDMMCBlockDevice.h" // Multi Media Card APIs
2+ #include " FATFileSystem.h" // Mbed API for portable and embedded systems
3+ SDMMCBlockDevice blockDevice;
4+ mbed::FATFileSystem fileSystem (" fs" );
5+
6+ #include " camera.h" // Arduino Mbed Core Camera APIs
7+ #include " himax.h" // Exclusive Camera library for the Portenta Vision Shield
8+ HM01B0 himax;
9+ Camera cam (himax);
10+
11+ FrameBuffer fb; // Buffer to save the capture
12+
13+ // Settings for our setup
14+ #define RES_H (unsigned int )240
15+ #define RES_W (unsigned int )320
16+ #define IMAGE_MODE CAMERA_GRAYSCALE
17+ #define IMAGE_BPP (unsigned int )8
18+ // Headers info
19+ #define HEADER_FILE_HEADER (unsigned int )14
20+ #define HEADER_DIB_SIZE (unsigned int )40
21+ #define HEADER_FULL_SIZE (HEADER_FILE_HEADER + HEADER_DIB_SIZE)
22+ #define PALETTE_SIZE (2 ^ IMAGE_BPP) * 4 // 4 bytes per color
23+
24+ void setup ()
25+ {
26+ Serial.begin (115200 );
27+ while (!Serial)
28+ ;
29+
30+ // Mount SD Card
31+ mountSD ();
32+
33+ // Init the cam QVGA, 30FPS, Grayscale
34+ if (!cam.begin (CAMERA_R320x240, IMAGE_MODE, 30 ))
35+ {
36+ Serial.println (" Unable to find the camera" );
37+ }
38+
39+ // Save the headers and the image data into the .bmp file
40+ parseData ();
41+ }
42+
43+ void loop ()
44+ {
45+ while (1 )
46+ ;
47+ }
48+
49+ // Mount File system block
50+ void mountSD ()
51+ {
52+ Serial.println (" Mounting SD Card..." );
53+
54+ int error = fileSystem.mount (&blockDevice);
55+ if (error)
56+ {
57+ Serial.println (" No SD Card found" );
58+ while (1 )
59+ ;
60+ }
61+ }
62+
63+ void parseData ()
64+ {
65+ unsigned char *imgData = NULL ;
66+ int fileSize = HEADER_FILE_HEADER + RES_W * RES_H;
67+
68+ FILE *file = fopen (" /fs/image.bmp" , " w+" );
69+
70+ // Get a Frame
71+ if (cam.grabFrame (fb, 3000 ) == 0 )
72+ {
73+ // Save the raw image data (8bpp grayscale)
74+ imgData = fb.getBuffer ();
75+ }
76+ else
77+ {
78+ Serial.println (" could not grab the frame" );
79+ while (1 )
80+ ;
81+ }
82+ // Bitmap structure (Head + DIB Head + ColorMap + binary image)
83+ unsigned char bitmapFileHeader[HEADER_FILE_HEADER];
84+ unsigned char bitmapDIBHeader[HEADER_DIB_SIZE];
85+ unsigned char colorMap[PALETTE_SIZE]; // Needed for <=8bpp grayscale bitmaps
86+
87+ // Set the file headers to 0
88+ memset (bitmapFileHeader, (unsigned char )(0 ), HEADER_FILE_HEADER);
89+ memset (bitmapDIBHeader, (unsigned char )(0 ), HEADER_DIB_SIZE);
90+ memset (colorMap, (unsigned char )(0 ), PALETTE_SIZE);
91+
92+ // Write the headers info
93+ // File header
94+ bitmapFileHeader[0 ] = ' B' ;
95+ bitmapFileHeader[1 ] = ' M' ;
96+ bitmapFileHeader[2 ] = (unsigned char )(fileSize);
97+ bitmapFileHeader[3 ] = (unsigned char )(fileSize >> 8 );
98+ bitmapFileHeader[4 ] = (unsigned char )(fileSize >> 16 );
99+ bitmapFileHeader[5 ] = (unsigned char )(fileSize >> 24 );
100+ bitmapFileHeader[10 ] = (unsigned char )HEADER_FULL_SIZE + PALETTE_SIZE;
101+
102+ // Info header
103+ bitmapDIBHeader[0 ] = (unsigned char )(HEADER_DIB_SIZE);
104+ bitmapDIBHeader[4 ] = (unsigned char )(RES_W);
105+ bitmapDIBHeader[5 ] = (unsigned char )(RES_W >> 8 );
106+ bitmapDIBHeader[8 ] = (unsigned char )(RES_H);
107+ bitmapDIBHeader[8 ] = (unsigned char )(RES_H >> 8 );
108+ bitmapDIBHeader[14 ] = (unsigned char )(IMAGE_BPP);
109+
110+ // Color palette for grayscale Bitmaps (8bpp)
111+ for (int i = 0 ; i < (2 ^ IMAGE_BPP); i++)
112+ {
113+ colorMap[i * 4 ] = i;
114+ colorMap[i * 4 + 1 ] = i;
115+ colorMap[i * 4 + 2 ] = i;
116+ }
117+
118+ // Write theh bitmap file
119+ fwrite (bitmapFileHeader, 1 , HEADER_FILE_HEADER, file);
120+ fwrite (bitmapDIBHeader, 1 , HEADER_DIB_SIZE, file);
121+ fwrite (colorMap, 1 , PALETTE_SIZE, file); // Color map
122+ fwrite (imgData, 1 , RES_H * RES_W, file);
123+
124+ // Close the stream (bitmap file)
125+ fclose (file);
126+ }
0 commit comments