tools/pyopenmv_fb: Add benchmark mode.

This commit is contained in:
iabdalkader 2024-08-03 16:19:15 +03:00
parent 44aec9179e
commit ae88fc46c5
2 changed files with 109 additions and 203 deletions

View File

@ -1,110 +0,0 @@
#!/usr/bin/env python2
# This file is part of the OpenMV project.
#
# Copyright (c) 2013-2021 Ibrahim Abdelkader <iabdalkader@openmv.io>
# Copyright (c) 2013-2021 Kwabena W. Agyeman <kwagyeman@openmv.io>
#
# This work is licensed under the MIT license, see the file LICENSE for details.
#
# An example script using pyopenmv to grab the framebuffer.
import sys
import numpy as np
import pygame
import pyopenmv
from time import sleep
script = """
import sensor, image, time
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.VGA) # Set frame size to QVGA (320x240)
img = sensor.snapshot() # Take a picture and return the image.
img.compress()
while(True):
img.flush()
"""
# init pygame
pygame.init()
if len(sys.argv)!= 2:
print ('usage: pyopenmv_fb.py <serial port>')
sys.exit(1)
connected = False
portname = sys.argv[1]
pyopenmv.disconnect()
for i in range(10):
try:
# opens CDC port.
# Set small timeout when connecting
pyopenmv.init(portname, baudrate=921600, timeout=0.050)
connected = True
break
except Exception as e:
connected = False
sleep(0.100)
if not connected:
print("Failed to connect to OpenMV's serial port.\n"
"Please install OpenMV's udev rules first:\n"
"sudo cp openmv/udev/50-openmv.rules /etc/udev/rules.d/\n"
"sudo udevadm control --reload-rules\n\n")
sys.exit(1)
# Set higher timeout after connecting for lengthy transfers.
pyopenmv.set_timeout(1*2) # SD Cards can cause big hicups.
pyopenmv.enable_fb(True)
pyopenmv.exec_script(script)
# init screen
running = True
screen = None
clock = pygame.time.Clock()
fps_clock = pygame.time.Clock()
font = pygame.font.SysFont("monospace", 50)
fb_size = 0
try:
while running:
data = None
# Read state
w, h, data, size, text = pyopenmv.read_state()
if text is not None:
print(text, end="")
if data is not None:
fps = fps_clock.get_fps()
fps_clock.tick(500)
if screen is None:
screen = pygame.display.set_mode((640, 120), pygame.DOUBLEBUF, 32)
screen.fill((0, 0, 0))
screen.blit(font.render("FPS %.2f %.2f MB/s"%(fps, fps * size / 1024**2), 1, (255, 0, 0)), (0, 30))
# update display
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
clock.tick(500)
except KeyboardInterrupt:
pass
pygame.quit()
pyopenmv.stop_script()

View File

@ -12,73 +12,77 @@ import sys
import numpy as np import numpy as np
import pygame import pygame
import pyopenmv import pyopenmv
from time import sleep import argparse
import time
script = """
# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!
test_script = """
import sensor, image, time import sensor, image, time
sensor.reset()
sensor.reset() # Reset and initialize the sensor. sensor.set_pixformat(sensor.RGB565)
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QVGA)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240) sensor.skip_frames(time = 2000)
sensor.skip_frames(time = 2000) # Wait for settings take effect. clock = time.clock()
clock = time.clock() # Create a clock object to track the FPS.
while(True): while(True):
clock.tick() clock.tick()
img = sensor.snapshot() # Take a picture and return the image. img = sensor.snapshot()
sensor.flush() sensor.flush()
print(clock.fps(), " FPS") print(clock.fps(), " FPS")
""" """
# init pygame bench_script = """
pygame.init() import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.VGA)
img = sensor.snapshot().compress()
while(True):
img.flush()
"""
if len(sys.argv)!= 2: def pygame_test(port, poll_rate, benchmark):
print ('usage: pyopenmv_fb.py <serial port>') # init pygame
sys.exit(1) pygame.init()
pyopenmv.disconnect()
connected = False connected = False
portname = sys.argv[1] for i in range(10):
pyopenmv.disconnect()
for i in range(10):
try: try:
# opens CDC port. # opens CDC port.
# Set small timeout when connecting # Set small timeout when connecting
pyopenmv.init(portname, baudrate=921600, timeout=0.050) pyopenmv.init(port, baudrate=921600, timeout=0.050)
connected = True connected = True
break break
except Exception as e: except Exception as e:
connected = False connected = False
sleep(0.100) time.sleep(0.100)
if not connected: if not connected:
print("Failed to connect to OpenMV's serial port.\n" print("Failed to connect to OpenMV's serial port.\n"
"Please install OpenMV's udev rules first:\n" "Please install OpenMV's udev rules first:\n"
"sudo cp openmv/udev/50-openmv.rules /etc/udev/rules.d/\n" "sudo cp openmv/udev/50-openmv.rules /etc/udev/rules.d/\n"
"sudo udevadm control --reload-rules\n\n") "sudo udevadm control --reload-rules\n\n")
sys.exit(1) sys.exit(1)
# Set higher timeout after connecting for lengthy transfers. # Set higher timeout after connecting for lengthy transfers.
pyopenmv.set_timeout(1*2) # SD Cards can cause big hicups. pyopenmv.set_timeout(1*2) # SD Cards can cause big hicups.
pyopenmv.stop_script() pyopenmv.stop_script()
pyopenmv.enable_fb(True) pyopenmv.enable_fb(True)
pyopenmv.exec_script(script) pyopenmv.exec_script(bench_script if benchmark else test_script)
# init screen # init screen
running = True running = True
screen = None screen = None
IMAGE_SCALE = 4 IMAGE_SCALE = 4
clock = pygame.time.Clock() clock = pygame.time.Clock()
fps_clock = pygame.time.Clock() fps_clock = pygame.time.Clock()
font = pygame.font.SysFont("monospace", 50) font = pygame.font.SysFont("monospace", 50)
try: if benchmark:
screen = pygame.display.set_mode((640, 120), pygame.DOUBLEBUF, 32)
try:
while running: while running:
# Read state # Read state
w, h, data, size, text = pyopenmv.read_state() w, h, data, size, text = pyopenmv.read_state()
@ -90,6 +94,7 @@ try:
fps = fps_clock.get_fps() fps = fps_clock.get_fps()
# Create image from RGB888 # Create image from RGB888
if not benchmark:
image = pygame.image.frombuffer(data.flat[0:], (w, h), 'RGB') image = pygame.image.frombuffer(data.flat[0:], (w, h), 'RGB')
image = pygame.transform.scale(image, (w * IMAGE_SCALE, h * IMAGE_SCALE)) image = pygame.transform.scale(image, (w * IMAGE_SCALE, h * IMAGE_SCALE))
@ -97,12 +102,15 @@ try:
screen = pygame.display.set_mode((w * IMAGE_SCALE, h * IMAGE_SCALE), pygame.DOUBLEBUF, 32) screen = pygame.display.set_mode((w * IMAGE_SCALE, h * IMAGE_SCALE), pygame.DOUBLEBUF, 32)
# blit stuff # blit stuff
if benchmark:
screen.fill((0, 0, 0))
else:
screen.blit(image, (0, 0)) screen.blit(image, (0, 0))
screen.blit(font.render("%.2f FPS %.2f MB/s"%(fps, fps * size / 1024**2), 5, (255, 0, 0)), (0, 0)) screen.blit(font.render("%.2f FPS %.2f MB/s"%(fps, fps * size / 1024**2), 5, (255, 0, 0)), (0, 0))
# update display # update display
pygame.display.flip() pygame.display.flip()
fps_clock.tick(250) fps_clock.tick(1000//poll_rate)
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
@ -113,9 +121,17 @@ try:
if event.key == pygame.K_c: if event.key == pygame.K_c:
pygame.image.save(image, "capture.png") pygame.image.save(image, "capture.png")
clock.tick(250) clock.tick(1000//poll_rate)
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
pygame.quit() pygame.quit()
pyopenmv.stop_script() pyopenmv.stop_script()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='pyopenmv module')
parser.add_argument('--port', action = 'store', help='OpenMV camera port (default /dev/ttyACM0)', default='/dev/ttyACM0', )
parser.add_argument('--poll', action = 'store', help='Poll rate in ms (default 4)', default=4)
parser.add_argument('--bench', action = 'store_true', help='Run throughput benchmark.', default=False)
args = parser.parse_args()
pygame_test(args.port, int(args.poll), args.bench)