Dans le monde de la vision par ordinateur et de l'IoT, des dispositifs compacts comme l'Arduino Nicla Vision prouvent qu'il est possible de faire de grandes choses dans de petites cartes. Avec sa puissante caméra embarquée et ses capacités d'intelligence artificielle, la Nicla Vision est idéale pour les tâches d'informatique de pointe, comme la lecture et l'interprétation de codes QR en temps réel.
Mais que se passe-t-il si vous avez besoin de plus que la simple lecture du code ? Et si votre application dépend de la connaissance de la position et de l'orientation du code QR ?
Dans cette page, nous allons explorer comment détecter la position et l'orientation d'un code QR en utilisant l'Arduino Nicla Vision. Que vous construisiez un système de tri automatisé, un scanner intelligent ou que vous souhaitiez simplement ajouter une couche d'intelligence à votre projet basé sur un code QR, la compréhension de l'orientation peut être la clé d'interactions plus dynamiques et plus fiables.
Voici le résultat en vidéo :
Ce script montre comment utiliser le Arduino Nicla Vision pour détecter des codes QR en utilisant sa caméra intégrée et visualiser leur orientation sur la base des coordonnées des coins. Le script inclut également des intégrations optionnelles de capteurs IMU et ToF. Voici le code source Python utilisé dans la vidéo :
import pyb # Import module for board related functions
import sensor # Import the module for sensor related functions
import image # Import module containing machine vision algorithms
import imu
from vl53l1x import VL53L1X
from machine import Pin, I2C
redLED = pyb.LED(1) # built-in red LED
blueLED = pyb.LED(3) # built-in blue LED
sensor.reset() # Initialize the camera sensor.
#sensor.set_pixformat(sensor.GRAYSCALE) # Sets the sensor to RGB
sensor.set_pixformat(sensor.RGB565) # Sets the sensor to RGB
sensor.set_framesize(sensor.QVGA) # Sets the resolution to 320x240 px
#sensor.set_framesize(sensor.VGA) # Sets the resolution to 480x320 px
#sensor.set_framesize(sensor.VGA) # Sets the resolution to 640x480 px
#sensor.set_framesize(sensor.XGA) # Sets the resolution to 640x480 px
#sensor.set_hflip(True) # Flips the image vertically
#sensor.set_hmirror(True) # Mirrors the image horizontally
redLED.on()
sensor.skip_frames(time = 100) # Skip some frames to let the image stabilize
redLED.off()
blueLED.on()
#tof = VL53L1X(I2C(2))
while(True):
#distance = tof.read()
#print(f"Distance: {distance}mm")
#imu_pitch = imu.pitch()
#imu_roll = imu.roll()
#temperature = imu.temperature_c()
img = sensor.snapshot()
#img.to_grayscale()
#print (distance, imu_pitch, imu_roll, temperature)
for code in img.find_qrcodes():
blueLED.on()
print (code)
img.draw_rectangle((code.x(), code.y(),code.w() ,code.h()),color=(255,0,0))
img.draw_circle(code.corners()[0][0], code.corners()[0][1], 5,color=(0,255,0))
img.draw_circle(code.corners()[1][0], code.corners()[1][1], 5,color=(0,0,255))
img.draw_circle(code.corners()[2][0], code.corners()[2][1], 5,color=(0,0,255))
img.draw_circle(code.corners()[3][0], code.corners()[3][1], 5,color=(0,0,255))
#print("You're on camera!")
#sensor.snapshot().save("example.jpg")
blueLED.off()
#blueLED.off()
#print("Done! Reset the camera to see the saved image.")
import pyb
import sensor
import image
import imu
from vl53l1x import VL53L1X
from machine import Pin, I2C
find_qrcodes()
.redLED = pyb.LED(1)
blueLED = pyb.LED(3)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.reset()
: Réinitialise le module de la caméra.set_pixformat(sensor.RGB565)
: Définit le format d'image en couleur.set_framesize(sensor.QVGA)
: Définit la résolution à 320x240 pixels (un bon équilibre entre qualité et performance).Vous pouvez éventuellement inverser ou refléter l'image en fonction de votre configuration matérielle :
# sensor.set_hflip(True)
# sensor.set_hmirror(True)
redLED.on()
sensor.skip_frames(time = 100)
redLED.off()
blueLED.on()
while(True):
img = sensor.snapshot()
for code in img.find_qrcodes():
blueLED.on()
print(code)
img.find_qrcodes()
: Détecte les codes QR dans l'image courante.print(code)
: Affiche les données et la position du code QR détecté.img.draw_rectangle((code.x(), code.y(),code.w() ,code.h()), color=(255,0,0))
img.draw_circle(code.corners()[0][0], code.corners()[0][1], 5, color=(0,255,0))
img.draw_circle(code.corners()[1][0], code.corners()[1][1], 5, color=(0,0,255))
img.draw_circle(code.corners()[2][0], code.corners()[2][1], 5, color=(0,0,255))
img.draw_circle(code.corners()[3][0], code.corners()[3][1], 5, color=(0,0,255))
# distance = tof.read()
# imu_pitch = imu.pitch()
# imu_roll = imu.roll()
# temperature = imu.temperature_c()
blueLED.off()
Ce script pose les bases d'un système embarqué basé sur la vision utilisant Nicla Vision qui peut :