OpenMV Camera Protocol V2 - Python library and CLI
Project description
OpenMV Python
Python library and CLI for communicating with OpenMV cameras.
Installation
pip install openmv
CLI Usage
Examples
# Basic usage - stream video from camera
openmv --port /dev/ttyACM0
# Run a custom script
openmv --port /dev/ttyACM0 --script my_script.py
# Adjust display scale (default is 4x)
openmv --port /dev/ttyACM0 --scale 5
# Run throughput benchmark
openmv --port /dev/ttyACM0 --bench
# Load firmware symbols for profiler function names
openmv --port /dev/ttyACM0 --firmware build/firmware.elf
# Quiet mode (suppress script output)
openmv --port /dev/ttyACM0 --quiet
# Debug mode (verbose logging)
openmv --port /dev/ttyACM0 --debug
# Preview a custom data channel
openmv --port /dev/ttyACM0 --channel ticks
Options
| Option | Default | Description |
|---|---|---|
--port PORT |
/dev/ttyACM0 |
Serial port |
--script FILE |
None | MicroPython script file to execute |
--scale N |
4 | Display scaling factor |
--poll MS |
4 | Poll rate in milliseconds |
--bench |
False | Run throughput benchmark mode |
--raw |
False | Enable raw streaming mode |
--timeout SEC |
1.0 | Protocol timeout in seconds |
--baudrate N |
921600 | Serial baudrate |
--firmware FILE |
None | Firmware ELF file for profiler symbol resolution |
--channel NAME |
None | Custom data channel to poll and print |
--quiet |
False | Suppress script output text |
--debug |
False | Enable debug logging |
Protocol Options
| Option | Default | Description |
|---|---|---|
--crc BOOL |
true | Enable CRC validation |
--seq BOOL |
true | Enable sequence number validation |
--ack BOOL |
true | Enable packet acknowledgment |
--events BOOL |
true | Enable event notifications |
--max-retry N |
3 | Maximum number of retries |
--max-payload N |
4096 | Maximum payload size in bytes |
--drop-rate N |
0.0 | Packet drop simulation rate (0.0-1.0, for testing) |
Keyboard Controls
| Key | Action |
|---|---|
ESC |
Exit |
P |
Cycle profiler overlay (Off → Performance → Events) |
M |
Toggle profiler mode (Inclusive ↔ Exclusive) |
R |
Reset profiler counters |
Library Usage
from openmv import Camera
script = """
import csi, time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
print(clock.fps(), "FPS")
"""
# Connect to camera
with Camera('/dev/ttyACM0') as camera:
# Stop running script (if any)
camera.stop()
# Execute script and enable streaming
camera.exec(script)
camera.streaming(True)
# Read frames and output
while True:
if frame := camera.read_frame():
print(f"Frame: {frame['width']}x{frame['height']}")
if text := camera.read_stdout():
print(text, end='')
Custom Channels
Custom channels allow bidirectional data exchange between the camera and host.
Camera-side script (MicroPython):
import time
import protocol
class TicksChannel:
def size(self):
return 10
def read(self, offset, size):
return f'{time.ticks_ms():010d}'
def poll(self):
return True
protocol.register(name='ticks', backend=TicksChannel())
Host-side (Python):
from openmv import Camera
with Camera('/dev/ttyACM0') as camera:
camera.exec(script)
while True:
# Check if channel has data
if camera.has_channel('ticks'):
size = camera.channel_size('ticks')
if size > 0:
data = camera.channel_read('ticks', size)
print(f"Ticks: {data.decode()}")
Quick Reference
Camera
from openmv import Camera
Camera(
port, # Serial port (e.g., '/dev/ttyACM0')
baudrate=921600, # Serial baudrate
crc=True, # Enable CRC validation
seq=True, # Enable sequence number validation
ack=True, # Enable packet acknowledgment
events=True, # Enable event notifications
timeout=1.0, # Protocol timeout in seconds
max_retry=3, # Maximum retries
max_payload=4096, # Maximum payload size
drop_rate=0.0, # Packet drop simulation (testing only)
)
Methods
| Method | Description |
|---|---|
connect() / disconnect() |
Manage connection |
is_connected() |
Check connection status |
exec(script) |
Execute a MicroPython script |
stop() |
Stop the running script |
streaming(enable, raw=False, resolution=None) |
Enable/disable video streaming |
read_frame() |
Read video frame → {width, height, format, depth, data, raw_size} |
read_stdout() |
Read script output text |
read_status() |
Poll channel status → {channel_name: bool, ...} |
has_channel(name) |
Check if channel exists |
channel_read(name, size=None) |
Read from custom channel |
channel_write(name, data) |
Write to custom channel |
channel_size(name) |
Get available data size |
version() |
Get firmware, protocol, and bootloader versions |
system_info() |
Get camera system information |
host_stats() / device_stats() |
Get protocol statistics |
Profiler Methods (if available)
| Method | Description |
|---|---|
read_profile() |
Read profiler data |
profiler_mode(exclusive) |
Set inclusive/exclusive mode |
profiler_reset(config=None) |
Reset profiler counters |
profiler_event(counter_num, event_id) |
Configure event counter |
Exceptions
| Exception | Description |
|---|---|
OMVException |
Base protocol exception |
TimeoutException |
Timeout during communication |
ChecksumException |
CRC validation failure |
SequenceException |
Sequence number mismatch |
API documentation
Full API documentation: docs/api.md
Requirements
- Python 3.8+
- pyserial >= 3.5
- numpy >= 1.20.0
- pygame >= 2.0.0
- pyelftools
License
MIT License - Copyright (c) 2025 OpenMV, LLC.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openmv-1.0.6.tar.gz.
File metadata
- Download URL: openmv-1.0.6.tar.gz
- Upload date:
- Size: 35.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2cd9809fbea94398cd66b106d5d155f5ac245a458666726269e5901372d376cd
|
|
| MD5 |
cc7779b7bd3d4642d268eaeb28073139
|
|
| BLAKE2b-256 |
abaf7b48209543f8c02f727b8c0a5f2653192d46b01e3fc7ad54b2be0448afb6
|
Provenance
The following attestation bundles were made for openmv-1.0.6.tar.gz:
Publisher:
package.yml on openmv/openmv-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openmv-1.0.6.tar.gz -
Subject digest:
2cd9809fbea94398cd66b106d5d155f5ac245a458666726269e5901372d376cd - Sigstore transparency entry: 764381064
- Sigstore integration time:
-
Permalink:
openmv/openmv-python@a4bc095572fb60aca17336aadfe174b8f03c9520 -
Branch / Tag:
refs/tags/v1.0.6 - Owner: https://github.com/openmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
package.yml@a4bc095572fb60aca17336aadfe174b8f03c9520 -
Trigger Event:
push
-
Statement type:
File details
Details for the file openmv-1.0.6-py3-none-any.whl.
File metadata
- Download URL: openmv-1.0.6-py3-none-any.whl
- Upload date:
- Size: 30.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca925830999835b56370bec44a6c28582e1a0efee1e8773a940ad860e8acc8ff
|
|
| MD5 |
cee1014ab9d09fe20a72fe5e954d7021
|
|
| BLAKE2b-256 |
995e5c771950f885d2391bf92b43db1ff4a794da3425c0e996f0cbba12d11121
|
Provenance
The following attestation bundles were made for openmv-1.0.6-py3-none-any.whl:
Publisher:
package.yml on openmv/openmv-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openmv-1.0.6-py3-none-any.whl -
Subject digest:
ca925830999835b56370bec44a6c28582e1a0efee1e8773a940ad860e8acc8ff - Sigstore transparency entry: 764381071
- Sigstore integration time:
-
Permalink:
openmv/openmv-python@a4bc095572fb60aca17336aadfe174b8f03c9520 -
Branch / Tag:
refs/tags/v1.0.6 - Owner: https://github.com/openmv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
package.yml@a4bc095572fb60aca17336aadfe174b8f03c9520 -
Trigger Event:
push
-
Statement type: