Skip to content

Commit bec8a5d

Browse files
committed
Add Vision Shield bitmap to SD sketch
1 parent 2e56c4b commit bec8a5d

File tree

1 file changed

+124
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)