Ov7670 Cam with Nano33BLE(Sense)

Hey @Rocksetta

Re: 1, what error do you see? I’ve just compiled a continuous gestures example for the Nano 33 BLE Sense and that works against 1.3.0. In general we try to support the latest board package, but we trail a bit because releases are unpredictable. We ran our integration tests again 1.1.6 but we’ll update to 1.3.x.

Double check, you have the right Mbed package? There are two and they both have version 1.3 which is fantastically confusing:

I will try the ov7670 camera again with MBED 1.3.0.

Yes the two Arduino Board types is really confusing, but after bugging Arduino on the facebook page https://www.facebook.com/groups/portenta/ they finally did the (Deprecated) label.

So my Impulse that works fine on the Portenta Vision Shield, when exported to the Nano33BleSense and running the Static Buffer (with raw data from the impulse) does not compile for either MBED 1.3.0 or 1.1.6. My OV7670 Camera does work using MBED 1.1.6 but I can’t get proof of it working on MBED 1.3.0 (It compiles and might work just the processes view does not prove that it works.).

I am thinking about trying the OV7670 Camera on the Portenta as I am a bit stuck with the Nano33BLESense.

@janjongboom any suggestions for how to change camera data 160 x 120 rgb565 to 96 x 96 rgb565 . If I was using tensorflowjs there is a method called slice that works great.

https://js.tensorflow.org/api/latest/#slice

What error do you see?

any suggestions for how to change camera data 160 x 120 rgb565 to 96 x 96 rgb565 . If I was using tensorflowjs there is a method called slice that works great.

Here’s an example: https://github.com/edgeimpulse/example-signal-from-rgb565-frame-buffer

1 Like

An update here @janjongboom.

  1. Trying to get the ov7670 working on the Portenta, but relying on Arduino to do a fix here.

  2. Trying to get the Portenta Vision Shield running with C++, but once again waiting for a few fixes from Arduino here. This is actually really close, just looks like the stream buffer is not getting zeroed between image samples.

  3. So back to working with the Nano33BLESense and the ov7670 Cam. It works really well, I just need to convert the byte data[160 * 120 * 2]; 160 width x120 height x 2 byte RGB565 at 5 FPS data to a format that EdgeImpulse can use.

I have looked at your link https://github.com/edgeimpulse/example-signal-from-rgb565-frame-buffer, and will work with the conversion function, just wondering what is the easiest method? Can you explain what format EdgeImpulse needs the data to be in? It sounds like I have to crop and convert my data to RGB888 but do I also have to convert the data to BMP format?

The following function looks fairly easy, but the cropping seems to need a BMP conversion that seems a bit inefficient.

static void _r565_to_rgb(uint16_t color, uint8_t *r, uint8_t *g, uint8_t *b) {
    *r = (color & 0xF800) >> 8;
    *g = (color & 0x07E0) >> 3;
    *b = (color & 0x1F) << 3;
}

P.S. I have a 32x32 RGB Impulse Arduino Library already made and can copy raw data from Edge Impulse. I will checkout the file uploader to see if I canupload my images directly from the Nano33BLESense.

update a few days later.

Since I have no idea how to crop the raw data, I made a webpage to show the issues and use integers to try to understand what I need to do. Kind of fun to try

https://hpssjellis.github.io/my-examples-of-edge-impulse/public/crop.html

Here is an image from the webpage above.

Hi @Rocksetta, so the classifier expects data in RGB888 format (e.g. 0xff0000 for a red pixel). But you already have a framebuffer in RGB565 format, so we can convert on-the-fly. In that case during classification we go into the RGB565 framebuffer, then dynamically convert to RGB888. This is set up in: https://github.com/edgeimpulse/example-signal-from-rgb565-frame-buffer/blob/3ae88b3703dd11724816a4ae389879f0909080ec/source/main.cpp#L95

Then the conversion happens in: https://github.com/edgeimpulse/example-signal-from-rgb565-frame-buffer/blob/3ae88b3703dd11724816a4ae389879f0909080ec/source/main.cpp#L33

That’s all you need. Whenever you call the run_classifier function it will automatically convert the framebuffer into the correct format. The bitmap functions are just there for debug purposes.

Now there is an issue with the example as it just does a cutout, rather than a resize. So if you have a 160x120 frame buffer and a model that operates on a 32x32 frame, it will cut out a 32x32 pixels from the frame buffer (thus only getting the middle part). Is there any functions in the OV7670 library to resize to e.g. 42x32 pixels? Then you can use the rest of the code as-is.

1 Like

A while back I put in a feature request to the Arduino OV767x library about allowing QQQVGA (80 x 60) and QQQQVGA (40 x 30), but for the moment I am fine with having to use the cutout image.

I am working on trying to understand how to insert your conversion code above into my generated ie-ov7670-detect-microcontroller library.zip example static_buffer program. I re-generated the zipped impulse to be 48 x 48 for testing.

I have working Arduino code for the Nano33BleSense with the OV7670 camera here that cutouts the 160 x 120 RGB565 to 48 x 48 RGB565. Theoretically I just need to convert that byte array into RGB888 to insert the raw data into the static_buffer example.

Thanks @janjongboom your code at https://github.com/edgeimpulse/example-signal-from-rgb565-frame-buffer/blob/3ae88b3703dd11724816a4ae389879f0909080ec/source/main.cpp#L95 seems to do what I want, I am just not yet sure how to implement it. I will work on that this week.

Jeremy.

Re your sketch, in cutout_get_data just replace frame_buffer with data and you should be good to go. You don’t need to manually convert to RGB888 or do the cropping yourself, the function does that already on the fly.

Yeh, now it looks fairly easy, somehow I missed reading this on the main README.md

" This is a full demonstration application that runs on macOS and Linux, but you’ll only need the r565_to_rgb and cutout_get_data functions, plus the defines from main.cpp , on your embedded device. These functions have no external dependencies and build on any system where the Edge Impulse classifier runs."

Sorry to keep bugging you @janjongboom, but I am so close to getting this OV7670 Camera working with EdgeImpulse and the Nano33 Ble Sense.

Present issues:

  1. First the OV7670 Arduino Library returns a byte array, Edge uses a uint16_t array. I think this code is working to copy from the byte array to the 2 byte array, but it feels like a waste of resources having both arrays.
byte data[original_width * original_height * 2]; // Original image 160 x 120 x 2 bytes RGB565 
uint16_t frame_buffer[original_width * original_height ]; 


  
  Camera.readFrame(data);
  memcpy(frame_buffer, data, sizeof(frame_buffer));


  1. Second issue is “cutout_get_data” is returning a “signal” with only 20 bytes.
    Serial.println("sizeof(signal) : " + String(sizeof(signal)) ); which then can’t be classified by the impulse. I am presently checking these issues.

.

My rough code called “nanocam.ino” and ie zipped library are at https://github.com/hpssjellis/my-examples-of-edge-impulse/tree/main/OV7670-Camera

My serial output is:

Edge Impulse Inferencing Demo
Edge Impulse standalone inferencing (Arduino)
Loading Image
Copying Byte image array to uint16 image array
sizeof(data) : 38400
sizeof(frame_buffer) : 38400
CUTOUT_COLS: 48
CUTOUT_ROWS: 48
Cropping Image
EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE: 2304
sizeof(signal) : 20
Running the Impulse


Kind of looks to me like my program is not running “cutout_get_data” I must admit I am not used to this method to call a function:

    Serial.println("Cropping Image");
    signal.get_data = &cutout_get_data;

Any suggestions?

@Rocksetta, I guess you see the SOS pattern on the builtin LED of the Nano 33 BLE Sense. That’s because an assertion failed (out of memory it seems on my board) but it’s not routed properly on the Nano 33 BLE Sense because of it’s weird USB Serial behavior. Will fix upstream. Anyway, this is how I got it to work:

  1. Get rid of the data declaration (and the line where you print the size).

  2. On line 191, change Camera.readFrame(data) into Camera.readFrame(frame_buffer). Now you don’t need the memcpy anymore and you save 38.4K of RAM.

    • If this gives a compiler error, do Camera.readFrame((uint8_t*)frame_buffer).
  3. Everything from line 216 - 273 is unnecessary. This is already done when you call run_impulse by the library. Just comment it out and this will also reduce a bunch of memory.

  4. Before the first #include add:

    #define EI_DSP_IMAGE_BUFFER_STATIC_SIZE 128
    

This makes it run on my Nano 33 BLE Sense (without the camera, but classifying the empty frame buffer).

FYI: The reason why sizeof(signal) is 20 bytes is because this is the size of the structure (which just contains of some variables and some function pointers), not of the data that it references.

1 Like

Thanks @janjongboom

Casting the array buffer was the main part I could not get on my own. Thanks, it runs with the camera now. I will just spend some time checking what the data sent to the classifier actually looks like.

Camera.readFrame((uint8_t*)frame_buffer)

1 Like

If you have the OV7670 this thread took a jump to the data loader thread at Data Forwarder Auto Label?

Should continue on here for now. Here is an RGB888 80 x 80 image from the Nano33BleSense with the OV7670 Cam serial output saved in a text file called frame14.txt and then converted to a jpg image using the edge-impulse-cli

edge-impulse-framebuffer2jpg --framebuffer-file "frame14.txt" --width 80 --height 80 --output-file frame14-out.jpg

Notice the res, green, blue, black and white all correct.

frame14-80x80-17-edge

Here is the file I used to test it on the Arduino without the Edge Impulse library.

Seems that the Impulse is also now working. Here is an image after the impulse has cropped and converted the RGB565 to RGB888. frame15-48x48-03

Next step, my Impulse is badly trained, I need to fix that.

1 Like

@Rocksetta :rocket: :rocket: :rocket: :rocket:

1 Like

So @janjongboom could you have a quick look at my code for the Nano33BleSense using the OV7670 Cam. The code is at the bottom of this post.

It is close to working, but does not give any positive results. The Impulse I am using is here, I have successfully used this same impulse exported for: the Himax WEI-I, The PortentaH7 with OpenMV and the PortentaH7 using only C++, but I just can’t get any results on the Nano33BleSense?

I can print out the “signal” which then shows a 48x48 accurate full color image, but I am not sure if it is properly being sent to the classifier with the command (which looks correct):

EI_IMPULSE_ERROR res = run_classifier(&signal, &result, false /* debug */);

I really wanted to solve the issue on my own, but it is presently not making sense. Everything compiles and runs, but it just is not getting any positive readings. Can you see anything glaringly obvious wrong with the code?

Here is my serial printout, with RGB888 image code.

Edge Impulse standalone inferencing (Arduino)
run_classifier returned: 0
Predictions (DSP: 4 ms., Classification: 706 ms., Anomaly: 0 ms.): 
[0.00000, 0.99609]
    is-microcontroller: 0.00000
    unknown: 0.99609
0xa0a488, 0xa0a488, 0xa0a490, 0xa0a490, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a8a0, 0xa0a8a0, 0xa0aca0, 0xa8a8a8, 0xa8a8a8, 0xa8a8a0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca0, 0xa0aca0, 0xa0aca0, 0xa8a8a0, 0xa8a8a0, 0xa0a8a0, 0xa0a898, 0xa0a898, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a488, 0xa0a890, 0xa0a888, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a888, 0xa0a888, 0xa0a488, 0xa0a488, 0xa0a890, 0xa0a890, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a8a0, 0xa8a8a0, 0xa8a8a0, 0xa8a8a0, 0xa8a8a8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8a8a8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8a8a0, 0xa8a8a0, 0xa8a8a0, 0xa8a8a0, 0xa8a898, 0xa8a898, 0xa8ac98, 0xa0ac98, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a888, 0xa0a490, 0xa0a490, 0xa0a890, 0xa0a890, 0xa0a490, 0xa0a490, 0xa0a890, 0xa0a890, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa8aca0, 0xa8aca0, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8a8a0, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca0, 0xa8aca0, 0xa8a8a0, 0xa0a8a0, 0xa0ac98, 0xa8a898, 0xa0a898, 0xa0a898, 0xa0a890, 0xa0a890, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a488, 0xa0a490, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0ac98, 0xa0a898, 0xa8a8a0, 0xa8a8a0, 0xa8a8a0, 0xa8a8a8, 0xa8a8a8, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8a8a0, 0xa0aca0, 0xa8ac98, 0xa0ac98, 0xa0a898, 0xa8a898, 0xa8a890, 0xa0a890, 0xa0a888, 0xa0a888, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a8a0, 0xa8a898, 0xa0a898, 0xa0a8a0, 0xa8a8a0, 0xa0a8a0, 0xa8a8a0, 0xa8aca0, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa0ac98, 0xa0a898, 0xa8a898, 0xa8a898, 0xa8a898, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0a890, 0xa0ac90, 0xa0ac98, 0xa0ac98, 0xa8ac98, 0xa0ac98, 0xa0a8a0, 0xa0aca0, 0xa8a898, 0xa8a898, 0xa8a8a0, 0xa8a8a0, 0xa8a8a0, 0xa8aca0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca8, 0xa8a8a8, 0xa8a8a0, 0xa8a8a0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa0ac98, 0xa0a898, 0xa0a890, 0xa0ac90, 0xa0a890, 0xa8a890, 0xa0a890, 0xa0a890, 0xa0a898, 0xa0ac98, 0xa0ac98, 0xa0ac98, 0xa8aca0, 0xa0aca0, 0xa0aca0, 0xa0aca8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8aca0, 0xa8aca0, 0xa8a8a0, 0xa8a8a0, 0xa8aca0, 0xa8aca0, 0xa8a8a0, 0xa8a8a0, 0xa8ac98, 0xa8ac98, 0xa8a898, 0xa8a898, 0xa8a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa0a898, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8a8a0, 0xa8a898, 0xa8a898, 0xa8a898, 0xa8a898, 0xa0ac98, 0xa0ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8a8b0, 0xa8a8a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8b0a0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8aca8, 0xa8aca8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa8aca8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8b0a8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xb0b0b0, 0xa8b0b0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8b0a8, 0xa8b0b0, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b0, 0xa8acb0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0a8, 0xb0b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xb0b0a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8b0a0, 0xa8b0a0, 0xa8b0a0, 0xa8b0a0, 0xa8aca0, 0xa8aca0, 0xa8b098, 0xa8b098, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xb0b0b0, 0xb0b0b0, 0xb0acb0, 0xb0acb0, 0xa8b0b0, 0xb0b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xb0aca8, 0xa8aca8, 0xa8aca8, 0xa8b0a8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8aca0, 0xa8b098, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xb0acb0, 0xb0acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xb0b0b0, 0xb0b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xb0aca8, 0xb0aca8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8aca0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8acb0, 0xa8b0b8, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xb0b0b0, 0xb0b0b8, 0xa8b0b8, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8b0b8, 0xa8b0b8, 0xa8b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b0, 0xa8b0b0, 0xb0b0b8, 0xb0acb0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8b0b8, 0xb0b0b0, 0xb0b4b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xb0b0b8, 0xb0b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b0, 0xa8b0b0, 0xb0b0b8, 0xb0b0b0, 0xa8b0b8, 0xb0b0b0, 0xb0b0b8, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0a8, 0xb0b0a8, 0xb0b0b0, 0xb0b0a8, 0xb0b0a8, 0xa8b0a8, 0xa8b0a0, 0xa8b0a0, 0xa8b0a8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8a8a0, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xb0b0b8, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b8, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b8, 0xb0b0b8, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0a8, 0xb0b0a8, 0xb0b0a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8a898, 0xa0a898, 0xa0a098, 0x98a498, 0xa0a490, 0x98a490, 0x98a898, 0xa0ac98, 0xa8ac98, 0xa8ac98, 0xa8ac98, 0xa8ac90, 0xb0b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b8, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa0a4a8, 0xa0a098, 0x98a098, 0x98bc98, 0x909890, 0x909498, 0x909490, 0x889890, 0x909088, 0x889088, 0x909c90, 0x988498, 0xa0a898, 0xa8ac98, 0xa8ac98, 0xa8ac90, 0xa8ac90, 0xb0b0b0, 0xb0b0b0, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b0, 0xb0b0b0, 0xb0b0b8, 0xb0acb0, 0xa8b0b8, 0xa8acb0, 0xa8a8a8, 0xa0a4a8, 0xa0a0a8, 0x98bca0, 0x9898a0, 0x989ca0, 0x9898a0, 0x909098, 0x889c98, 0x909498, 0x909490, 0x909088, 0x889470, 0x786060, 0x607850, 0x505428, 0x282468, 0x6874a0, 0xa09888, 0x988090, 0xa0a890, 0xa0a890, 0xa8ac90, 0xa0ac90, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b8, 0xb0b0b0, 0xa8b0b0, 0xa8b0b8, 0xb0b0b8, 0xb0b0b8, 0xa8b0b8, 0xa8acb0, 0xa8a8b0, 0xa8a4b0, 0xa0a4b0, 0x98a0a8, 0x98a0a8, 0x98b8a8, 0x989cb0, 0x9880a8, 0x98a0a8, 0x98a0a8, 0x98b8a0, 0x908c98, 0x888088, 0x788870, 0x686c78, 0x686c90, 0x888c90, 0x889c98, 0x909c98, 0x989c78, 0x807c38, 0x403c40, 0x303c40, 0x303068, 0x707890, 0x909480, 0x909c88, 0x988488, 0xa0a890, 0xa0ac90, 0xa8ac90, 0xb0b0b8, 0xb0b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xb0acb8, 0xa8a8b0, 0xa8a8b0, 0xa0a4a8, 0xa0a0b0, 0xa0a0a8, 0x98bcb0, 0x9880b0, 0x98a0b0, 0xa0a0b8, 0xa0a4b0, 0xa0a4b0, 0xa0a0a8, 0xa0bca8, 0x989098, 0x888890, 0x809c88, 0x786070, 0x587070, 0x505070, 0x585860, 0x382060, 0x404058, 0x484080, 0x706c90, 0x908c90, 0x888098, 0x98a098, 0x98b870, 0x807830, 0x403830, 0x282038, 0x305c48, 0x584878, 0x888c78, 0x889078, 0x909c88, 0xa08490, 0xa0a888, 0xa0a888, 0xa8b0b0, 0xa8acb0, 0xa8acb0, 0xa8a8b0, 0xa0a4b0, 0xa0a4b0, 0xa0a0a8, 0x98a0a8, 0x98a0b0, 0x98a0b0, 0xa0a4b8, 0xa0a8b8, 0xa8a8b0, 0xa8a8b0, 0xa8acb8, 0xa8a8b0, 0xa0bca8, 0x9090a0, 0x888090, 0x809888, 0x786c80, 0x706480, 0x687068, 0x504860, 0x485c68, 0x403c70, 0x402c60, 0x302c60, 0x302c58, 0x303c68, 0x403c58, 0x482c88, 0x706888, 0x988888, 0x988c80, 0x888878, 0x809060, 0x786030, 0x485428, 0x303428, 0x303038, 0x504468, 0x888870, 0x888c70, 0x909c80, 0x988888, 0xa0a890, 0xa0a888, 0x98bcb0, 0x9880b0, 0x98a0b0, 0x98a0b0, 0xa0a4b0, 0xa0a8b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8acb0, 0xa8a8b0, 0xa8a4b0, 0xa8b4a0, 0x988090, 0x809888, 0x807480, 0x707060, 0x485468, 0x383488, 0x584c90, 0x707070, 0x584c78, 0x505460, 0x383468, 0x403068, 0x402850, 0x302450, 0x282850, 0x302c50, 0x302c48, 0x383470, 0x604068, 0x686c50, 0x504440, 0x505c38, 0x482040, 0x485838, 0x403c28, 0x382818, 0x283c30, 0x483870, 0x806468, 0x888868, 0x888080, 0xa0a880, 0xa0ac90, 0xa0a888, 0xa8acc0, 0xa8acc0, 0xa8acb8, 0xa8a8b8, 0xa8a4b0, 0xa8a4b0, 0xa8a0a8, 0xa8bca8, 0xa898a8, 0xa094a0, 0xa094a0, 0xa094a0, 0xa090a0, 0x989480, 0x807888, 0x807888, 0x787870, 0x584860, 0x485470, 0x402c88, 0x584490, 0x686878, 0x504070, 0x405068, 0x382080, 0x485c80, 0x483c60, 0x403058, 0x303060, 0x302c60, 0x303050, 0x303058, 0x303848, 0x382450, 0x485058, 0x504870, 0x687088, 0x889468, 0x687c28, 0x402c18, 0x282030, 0x485868, 0x806460, 0x888c68, 0x908488, 0xa0a888, 0xa8a888, 0xa8a888, 0xa098a8, 0xa098a8, 0xa098a8, 0xa094a8, 0xa09ca8, 0xa09ca8, 0xa09ca8, 0xa080a8, 0xa0a0a8, 0xa0a4b0, 0xa8a8b0, 0xa0acb0, 0xa0bca8, 0x988088, 0x788898, 0x888c98, 0x889868, 0x585868, 0x584c78, 0x584878, 0x504878, 0x505c70, 0x403468, 0x383060, 0x302c90, 0x505498, 0x585478, 0x584060, 0x404470, 0x405480, 0x584860, 0x405490, 0x706470, 0x606068, 0x607c88, 0x807c68, 0x585068, 0x707c38, 0x402c18, 0x303420, 0x303448, 0x584470, 0x888468, 0x808c78, 0x908480, 0xa0a480, 0xa8a888, 0xa0a888, 0xa09ca8, 0xa084b0, 0xa8a4b0, 0xa0a8b8, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb0, 0xa8a0a8, 0x98a890, 0x809480, 0x706878, 0x687c78, 0x605878, 0x585880, 0x605480, 0x605078, 0x505078, 0x585c68, 0x403488, 0x585488, 0x584090, 0x606ca8, 0x909470, 0x584078, 0x687870, 0x604058, 0x485060, 0x585040, 0x382c38, 0x302838, 0x282030, 0x203828, 0x201c30, 0x200020, 0x283038, 0x383c40, 0x604468, 0x888868, 0x889070, 0x908478, 0xa0a480, 0xa0a888, 0xa0a888, 0xa0a8b8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8b0b8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8a4b0, 0xa0a488, 0x789c90, 0x786078, 0x606480, 0x606080, 0x606890, 0x686080, 0x607898, 0x707898, 0x706880, 0x687490, 0x707078, 0x504c70, 0x505878, 0x585458, 0x383458, 0x382c50, 0x302450, 0x282450, 0x282040, 0x282448, 0x282440, 0x282c48, 0x303040, 0x383040, 0x383448, 0x585c50, 0x605460, 0x686c78, 0x888c78, 0x909480, 0x908080, 0xa0a888, 0xa0a880, 0xa0a880, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8b0b8, 0xa8acb8, 0xa8acb0, 0xa8a8b0, 0xa0b880, 0x707078, 0x5054a0, 0x786888, 0x687490, 0x706080, 0x607070, 0x505080, 0x585868, 0x403470, 0x383470, 0x382870, 0x382870, 0x382860, 0x302c68, 0x383060, 0x383060, 0x382068, 0x485860, 0x402c70, 0x505878, 0x605c68, 0x604c78, 0x687470, 0x707878, 0x786878, 0x809080, 0x888878, 0x809480, 0x889080, 0x909480, 0x988080, 0xa0a480, 0xa0a880, 0xa0a880, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8a8b0, 0xa8a4b0, 0xa0bc80, 0x707078, 0x584870, 0x505870, 0x403470, 0x403070, 0x383068, 0x383070, 0x383070, 0x383878, 0x403478, 0x402478, 0x484880, 0x505480, 0x584090, 0x686888, 0x687090, 0x707c90, 0x806498, 0x808c90, 0x889098, 0x909898, 0x909ca0, 0x988498, 0x98a898, 0xa0a8a0, 0xa0a498, 0x98ac80, 0x889488, 0x908c78, 0x889078, 0x908080, 0x98a488, 0xa0a888, 0xa0a880, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8a8b0, 0xa8a8b0, 0xa8a8b0, 0xa8a8b0, 0xa0a8b0, 0xa0a4a8, 0xa0a4b0, 0xa0b8a0, 0x908898, 0x809c70, 0x505c70, 0x402078, 0x484478, 0x485088, 0x585c88, 0x604498, 0x687490, 0x787898, 0x806498, 0x8090a8, 0x8894a0, 0x889ca8, 0x9080a8, 0x98a4b0, 0x98a8a8, 0xa0a8a8, 0xa0a8a8, 0xa0a8a8, 0xa0a8a8, 0xa0a8a8, 0xa0a8a0, 0xa0aca0, 0xa0aca0, 0xa0a498, 0x98ac80, 0x889488, 0x908870, 0x888870, 0x908080, 0x98a888, 0xa0ac88, 0xa0a880, 0xa8a8b0, 0xa8a8b0, 0xa8a8b0, 0xa0a8b0, 0xa8a8b0, 0xa8a8b0, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa0a4b0, 0xa0bca8, 0x9090a0, 0x888898, 0x808898, 0x8090a0, 0x8894a8, 0x9098b0, 0x9084b8, 0x98a8b0, 0xa0a8b8, 0xa0acb8, 0xa0a8b8, 0xa0a8b0, 0xa0a8b0, 0xa0a8b0, 0xa0acb0, 0xa0aca8, 0xa0a8a8, 0xa0aca8, 0xa0aca8, 0xa0aca8, 0xa0aca8, 0xa0a4a0, 0xa0a4a0, 0xa0a098, 0x98a098, 0x98bc90, 0x989490, 0x908470, 0x888c78, 0x908488, 0xa0a890, 0xa8ac90, 0xa8a888, 0xa8a8b0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa0a8b8, 0xa0a8b0, 0xa0acb0, 0xa0acb8, 0xa0acb8, 0xa0a8b8, 0xa0acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa0acb8, 0xa0acb0, 0xa0acb0, 0xa0acb0, 0xa0a8b0, 0xa0a4a8, 0xa0a0a8, 0x98bca0, 0x9898a0, 0x989898, 0x989090, 0x909890, 0x909490, 0x909898, 0x9080a0, 0x98a098, 0xa0b890, 0x988470, 0x889880, 0x988890, 0xa0a890, 0xa8ac90, 0xa8ac90, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa0acb8, 0xa8acb8, 0xa8acb8, 0xa0a8b8, 0xa0a4b8, 0xa0a0b0, 0x98bcb0, 0x989cb0, 0x9898a8, 0x9094a8, 0x9094a8, 0x9094a0, 0x9094a0, 0x9094a0, 0x8894a0, 0x9094a0, 0x9094a0, 0x909ca0, 0x909ca0, 0x9080a8, 0x98a0a8, 0x98bc98, 0xa09490, 0x988470, 0x889c80, 0xa08890, 0xa0ac90, 0xa8ac90, 0xa0ac90, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8a8b8, 0xa0a8b0, 0xa0a0b0, 0xa0a0b0, 0xa0a0b0, 0x98bca8, 0x909ca8, 0x989ca8, 0x9898a8, 0x9098a8, 0x9094b0, 0x9094a8, 0x9098b0, 0x9098b0, 0x909cb0, 0x9098b0, 0x9080b0, 0x98a8b8, 0xa0a8b0, 0xa0b0b8, 0xa0b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8b0b0, 0xa8aca8, 0xa8a4a0, 0xa0bc98, 0xa09490, 0x988478, 0x889c90, 0xa08890, 0xa0ac90, 0xa8ac90, 0xa0ac90, 0xa8a8b0, 0xa8acb8, 0xa8acb0, 0xa0acb0, 0xa0a8b0, 0xa8acb8, 0xa8a8b0, 0xa0a8b0, 0xa0a8b0, 0xa0a4b0, 0x98a0b0, 0x98bcb0, 0x989cb0, 0x989ca8, 0x9894a8, 0x9098a8, 0x9094a8, 0x9098b0, 0x9098b0, 0x9094b0, 0x909cb0, 0x9080b8, 0x98a4b8, 0x98a8b8, 0xa0acb8, 0xa8acc0, 0xa8b0c0, 0xa8acc0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xa8acb0, 0xa8acb0, 0xa8a8a8, 0xa8a0a8, 0xa8bca0, 0xa89c98, 0xa884a0, 0xa8a4a0, 0xa8a4a0, 0xa8b890, 0x989088, 0x989890, 0xa08898, 0xa8a898, 0xa8a898, 0xa8a898, 0xa0a8b0, 0xa0a4b0, 0xa0a4b0, 0xa0a0a8, 0x98bca8, 0x9898a8, 0x9894a8, 0x9094a8, 0x9094a8, 0x9094a8, 0x9094a8, 0x9098b0, 0x909cb8, 0x9880b8, 0x98a4b8, 0xa0a8c0, 0xa0acb8, 0xa8acc0, 0xa8acc0, 0xa8acb8, 0xa8acb8, 0xa8b0c0, 0xb0b0c0, 0xa8b0c0, 0xa8acb8, 0xb0a8b8, 0xa8a8b8, 0xb0a4b0, 0xa8a0b0, 0xa8a0b0, 0xa8bca8, 0xa89ca8, 0xa880a8, 0xa8a4a8, 0xa8a4a8, 0xa8a8b0, 0xb0aca8, 0xb0aca8, 0xb0aca8, 0xa8a8a8, 0xa8a8a0, 0xa8bc98, 0x989c98, 0xa09890, 0xa08898, 0xa8a898, 0xa8ac98, 0xa8a898, 0x9094a8, 0x8894a8, 0x9098a8, 0x9098b0, 0x909cb0, 0x9880b8, 0x98a4b8, 0xa0acc0, 0xa0acc0, 0xa8acc0, 0xa8acb8, 0xa8b0c0, 0xb0b0c0, 0xa8b0c0, 0xb0b0c0, 0xb0b0b8, 0xa8acb8, 0xb0a8b8, 0xa8a8b8, 0xb0a4b0, 0xa8a0b0, 0xa8a0b0, 0xa8a0b0, 0xb0a0b0, 0xb0a4b0, 0xb0a4b0, 0xb0a8b8, 0xb0a8b8, 0xb0acb8, 0xb0acb8, 0xb0b0b8, 0xb0acb8, 0xa8b0b8, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8a8b0, 0xa8a8b0, 0xa8aca8, 0xa0a8a8, 0xa0a8a8, 0xa0a0a0, 0x98b898, 0x989898, 0x988498, 0xa0a898, 0xa8ac98, 0xa0a898, 0xa0a4b0, 0xa0acb8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0c0, 0xa8acb8, 0xa8acb8, 0xb0acb0, 0xa8a4b0, 0xa8a4b0, 0xa8a0b0, 0xa8a4b0, 0xb0a0b0, 0xb0a4b0, 0xb0a8b0, 0xb0a8b0, 0xb0a8b8, 0xb0acb8, 0xb0acb8, 0xb0acb8, 0xb0acb8, 0xb0b0b8, 0xb0b0c0, 0xb0acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb8, 0xa8b0b8, 0xa8acb0, 0xa8b0b0, 0xa0acb0, 0xa0a8b0, 0xa8a8b0, 0xa8aca8, 0xa0aca8, 0xa0aca8, 0xa0a8a0, 0xa0b490, 0x909490, 0x988898, 0xa0a8a0, 0xa8ac98, 0xa8a898, 0xa8a4b0, 0xa8a4b0, 0xa8a0b0, 0xa8a0b0, 0xa8bcb0, 0xa89cb0, 0xa880b0, 0xa8a4b0, 0xa8a4b0, 0xa8a8b8, 0xb0a8b8, 0xb0acb8, 0xb0acb8, 0xb0acb8, 0xb0acc0, 0xb0acc0, 0xb0acb8, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xa8b0b8, 0xa8acc0, 0xa8acc0, 0xa8acc0, 0xa8acc0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xa8b4b8, 0xb0acb8, 0xa8acb0, 0xa0acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8acb0, 0xa8aca8, 0xa0a8a8, 0xa0b490, 0x9084a0, 0xa0aca0, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8a0b0, 0xa8a4b0, 0xb0a8b0, 0xa8acb8, 0xb0acb8, 0xb0acb8, 0xb0acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8b0b8, 0xa8b0b8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acc0, 0xa8acc0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0c0, 0xa8b0c0, 0xa8b0c0, 0xa8b0c0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8acb0, 0xa8a8b0, 0xa0acb0, 0xa8aca8, 0xa8a8a8, 0xa0a4a0, 0xa0a0a0, 0xa0bc98, 0x989890, 0x989c90, 0x988ca0, 0xa8aca8, 0xa8aca0, 0xa8aca0, 0xa8aca0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acc0, 0xa8acc0, 0xa8acc0, 0xa8acc0, 0xa8acc0, 0xa8acc0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8acc0, 0xa8b0c0, 0xa8b0b8, 0xa8b0b8, 0xa8b0b8, 0xa8b0c0, 0xa8b0c0, 0xa8a8b8, 0xa8a8b0, 0xa8acb8, 0xa8a8b0, 0xa0a8b0, 0xa0a8a8, 0xa0acb0, 0xa8acb0, 0xa8a4a8, 0xa0a0a8, 0xa0a4a8, 0xa0a8a0, 0xa0aca8, 0xa0aca8, 0xa8b4b0, 0xa8b4b0, 0xb0b8b0, 0xb0b4a8, 0xb0b4a8, 0xa8b0a8, 0xa8b0a0, 0xa8aca0, 0xa8aca0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acc0, 0xa8b0b8, 0xa8b0b8, 0xa8acc0, 0xa8b0c0, 0xa8acc0, 0xa8b0c0, 0xa8b0c0, 0xa8acc0, 0xa8acb8, 0xa8acb8, 0xa8acb0, 0xa8acb0, 0xa0a8b0, 0xa8a8b0, 0xa8a8a8, 0xa8a8a8, 0xa8a8b0, 0xa0a0a8, 0x98a0a8, 0xa0a0a8, 0xa0a8a8, 0xa0a8a8, 0xa0acb0, 0xa8b0b0, 0xa8acb0, 0xa8a8b0, 0xa0b4b8, 0xb0bcc0, 0xb8bcb8, 0xb8bcb8, 0xb8bcb8, 0xb8bcb8, 0xb8bcb0, 0xb0b8b0, 0xb0b4b0, 0xb0b4a8, 0xa8b0a8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa0a8b8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8acc0, 0xa8acc0, 0xa8acb8, 0xa8acb8, 0xa8acb8, 0xa8a4b8, 0xa0a4b0, 0xa0a0b0, 0xa0a0a8, 0xa0bca8, 0x989ca0, 0x9898a0, 0x9898a0, 0x989ca0, 0xa09ca8, 0xa080a8, 0xa0a4a8, 0xa0acb0, 0xa8b0b8, 0xa8b8c0, 0xb0bcc0, 0xb8bcc0, 0xb8a0c0, 0xb8c4c8, 0xb8c0c0, 0xb8c0c0, 0xb8dcc0, 0xb8bcc0, 0xb8bcc0, 0xb8bcc0, 0xb0bcb8, 0xb8bcb8, 0xb0b8b8, 0xb0b4b0, 0xb0b4b0, 0xb0b4b0, 0xb0b4b0, 0xb0b0b0, 0xb0b0a8, 0xa8b0a8, 0xa8aca0, 0xa8aca0, 0xa0acb0, 0xa0acb0, 0xa0a8b0, 0xa0a8b0, 0xa0a8b0, 0xa0a4b0, 0xa0a0a8, 0xa0a0a8, 0xa0bca0, 0x9898a0, 0x989498, 0x9898a0, 0x9898a0, 0x989ca8, 0x9880a8, 0x98a4b0, 0xa0acb0, 0xa8b4b8, 0xa8b8c0, 0xb0bcc0, 0xb0bcc0, 0xb8bcc0, 0xb8bcc0, 0xb8a0c8, 0xb8c0c8, 0xb8c0c8, 0xb8c0c8, 0xb8dcc8, 0xb8bcc0, 0xb8a0c0, 0xb8dcc0, 0xb8bcc0, 0xb0bcc0, 0xb8bcc0, 0xb8b8c0, 0xb0b8c0, 0xb0b8b8, 0xb0b8b8, 0xb0b4b0, 0xb0b4b0, 0xb0b4b0, 0xb0b4b0, 0xb0b0a8, 0xa8b0a8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0xa8aca8, 0x989c98, 0x989898, 0x989498, 0x909498, 0x909498, 0x909898, 0x989ca8, 0x9880a8, 0x98a8b0, 0xa0acb8, 0xa8b4b8, 0xa8b8c0, 0xb0b8c0, 0xb0bcc0, 0xb8a0c0, 0xb8c0c0, 0xb8c0c8, 0xb8c0c8, 0xb8c0c8, 0xb8c0c8, 0xb8dcc8, 0xb8bcc8, 0xb8bcc0, 0xb8bcc0, 0xb8b8c0, 0xb8b8c0, 0xb8bcc8, 0xb8b8c8, 0xb8bcc0, 0xb8bcc0, 0xb8bcc0, 0xb0b8c0, 0xb0b8b8, 0xb0b4b8, 0xb0b4b8, 0xb0b4b8, 0xb0b4b8, 0xb0b4b8, 0xb0b4b8, 0xb0b0b8, 0xb0b0b0, 0xb0b0b0, 0xa8b0b0, 0xb0b0b0, 0xb0b0b0, 0xa8acb0, 0xa8aca8, 0xa8aca8


The above RGB888 code when saved in a text file called frame23.txt and converted using

edge-impulse-framebuffer2jpg --framebuffer-file "frame23.txt" --width 48 --height 48 --output-file frame23-15.jpg

Shows an image of the Nano33BleSense. You can even see the correct blue and red lines on the breadboard.

image

Below is a Github link to the code I am using.

1 Like

Aaaargh! It was my own mess up.

When I tested the Impulse on the HIMAX and PortentaH7 I switched the impulse to GRAYSCALE, I thought I had switched it back to full color but I hadn’t.

My OV7670 Camera now works fine with the Nano33BleSense. Just in time for my next after school Machine Learning class.

So I guess this is really good. Now just got to figure out how big a resolution I can use.

I now know why. Right beside the GRAYSCALE/COLOR selector their is a “Save Parameter” button. I changed from GRAYSCALE back to COLOR but never clicked the save parameter button.

1 Like

Note: at the moment (because the limited amount of flash allocated on the M7 core, see the other forum thread) you can’t run the 96x96 models on the Portenta H7 yet, but we’re working on a fix with Arduino to allocate more flash.

1 Like