Hi, you can do this via the alloc_fb method. As we’re a microcontroller we really don’t have a lot of RAM onboard… so, things are slightly weird. But, I’ve been extending the functional of the system to meet customer requests. So, please excuse the limitations. Anyway, checkout the in memory frame differencing script:
# In Memory Basic Frame Differencing Example
# This example demonstrates using frame differencing with your OpenMV Cam. It's
# called basic frame differencing because there's no background image update.
# So, as time passes the background image may change resulting in issues.
import sensor, image, pyb, os, time
TRIGGER_THRESHOLD = 5
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.QVGA) # or sensor.QQVGA (or others)
sensor.skip_frames(time = 2000) # Let new settings take affect.
sensor.set_auto_whitebal(False) # Turn off white balance.
clock = time.clock() # Tracks FPS.
# Take from the main frame buffer's RAM to allocate a second frame buffer.
# There's a lot more RAM in the frame buffer than in the MicroPython heap.
# However, after doing this you have a lot less RAM for some algorithms...
# So, be aware that it's a lot easier to get out of RAM issues now. However,
# frame differencing doesn't use a lot of the extra space in the frame buffer.
# But, things like AprilTags do and won't work if you do this...
extra_fb = sensor.alloc_extra_fb(sensor.width(), sensor.height(), sensor.RGB565)
print("About to save background image...")
sensor.skip_frames(time = 2000) # Give the user time to get ready.
print("Saved background image - Now frame differencing!")
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
# Replace the image with the "abs(NEW-OLD)" frame difference.
hist = img.get_histogram()
# This code below works by comparing the 99th percentile value (e.g. the
# non-outlier max value against the 90th percentile value (e.g. a non-max
# value. The difference between the two values will grow as the difference
# image seems more pixels change.
diff = hist.get_percentile(0.99).l_value() - hist.get_percentile(0.90).l_value()
triggered = diff > TRIGGER_THRESHOLD
print(clock.fps(), triggered) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
You can also find this under examples → frame differencing. Basically, this shows you how to alloc another frame buffer and then copy images over to it. Note that you’ll want to reduce the res to fit both images. Also, I don’t believe the code for snapshot() right now checks to see if it’s overwriting the alloced fb (this is a todo to fix). So, if things randomly crash reduce the res. That said, the alloced fb is part of the same data structure used by our imaging methods, so, if you try to use a method that needs too much ram you’ll get an error in that case. Just not if snapshot() overwrites the alloced fb.