- Scriptable in Python3.
- Sub-$15 BOM/1000's including 4-layer PCB (OpenMV1).
- On board uSD or internal flash storage for storing scripts/images/video.
- 2MP RGB/YUV/JPEG sensor (OV2640).
- Recording/Streaming MJPEG: to SD or via external WiFi shield.
- Extension Header: breaks UART/PWM/SPI/I2C
- Friendly IDE: upload/execute scripts, upload templates, view the framebuffer.
- 16MB SDRAM: on-board enables uClinux to run on OpenMV2
- Image processing:
- Viola-jones object detection (comptatible with OpenCV's cascades)
- Template matching with NCC (normalized cross correlation)
- FAST/FREAK: keypoint detector/descriptor and matching.
- Misc: RGB->LAB CLUT, kmeans clustering, histogram, median filter, scaling, sub-image and blitting, alpha blending.
- MCU: The MCU I choose is the STM32F4xx, an ARM Cortex-M4 micro running at 168-180MHz. It has a single precision FPU, DSP capabilities and a DCMI (Digital Camera Interface). Having a hardware camera interface along with the FPU/DSP made this particular MCU a perfect match for the project.
- PCB: A 4-layer PCB is used, which costs more but much better signal integrity/EMI wise, especially when both sides have components and not much reference planes left over, plus, using 4-layers made it possible to fit everything on a 1.0x1.3 inches board. Prototypes are all done by OSHPark.
- Image Sensor: OpenMV1 supports many single package lens/sensors, such as the OV965x(1.3MP), OV2640(2MP/JPEG). Using a single package sensor allows experimenting with different sensors easily. OpenMV2 supports only the OV2640 with an external lens.
- Debugging/Firmware update: The serial wire debugging (SWD) is broken out on a 2.00mm header, and the DFU is easily accessible to upload new firmware images via USB.
- I/O Expansion: The main 2.54mm header breaks SPI, I2C, USART and PWM, for example, an SPI LCD viewing the framebuffer (the LCD driver is written completely in Python):
- Wireless expansion: I designed WiFi shields based on the CC3K module from TI, for OpenMV1/2. The camera can stream MJPEG to compatible browsers, and here's a custom Android demo viewing the camera stream from my phone, the CC3K module is fast enough (54Mbps) to stream live video from the camera:
OpenMV uses a lot of cool SW, for example, ChaN's FatFS, CC3K SDK, ARM's DSP/Math libraries etc.. And of course it's completely programmable in Python 3! Yes, you can write Python scripts that have access to peripherals (SPI/I2C/UART), uSD, wireless, and of course the image processing code.
OpenMV also has a nice IDE that I made with Python/Glade/PyGTK. The IDE has syntax highlighting, it can upload or run scripts on the camera, view the framebuffer, and can even help with some image processing tasks, for example using the IDE you can upload templates to the camera for template matching:
I plan on extending the IDE with more features, to communicate with the camera using sockets when WiFi shields are connected, this way the IDE will have remote access to the camera to stream images or upload scripts over the air.
The second OpenMV uses the newer STM32F429 runing at 180MHz, with more built-in SRAM, external 16MB SDRAM, external lens for the sensor, 2xIR LEDs, 2xServo headers and 20 I/Os.. see full specs below:
- Processor: STM32F407 (168MHz)
- Features: FPU/DSP/DCMI
- RAM:196KB SRAM
- Flash: 512KBs
- Sensor: OV965x(1.3MP)/OV2640(2MP/JPEG)
- I/O: USART/SPI/I2C/PWM
- USB 2.0 FS
- uSD interface: SPI
- Power consumption: 120 mA
- Dimensions: 1.0" x 1.3"
- Processor: STM32F429 (180MHz)
- Features: FPU/DSP/DCMI/2D Acceleration
- RAM:256KB SRAM/16MB SDRAM(up to 64MB)
- Flash: 2MB
- Sensor: OV2640(2MP/JPEG)
- 2x IR LEDS
- 2x Servo headers
- 20 I/Os: USART/SPI/I2C/PWM
- USB 2.0 FS
- uSD interface: SDIO (4-bit mode)
- Power consumption: TBD
- Dimensions: 1.6" x 2.0"