Orientation du code QR avec Arduino Nicla Vision

Photographie de la carte Arduino Nicla Vision utilisée pour la lecture des code QR

Introduction

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 :

Code source

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.")

Analyse du code

Importations et configuration

import pyb
import sensor
import image
import imu
from vl53l1x import VL53L1X
from machine import Pin, I2C

LED Initialization

redLED = pyb.LED(1)
blueLED = pyb.LED(3)

Configuration de la caméra

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)

Vous pouvez éventuellement inverser ou refléter l'image en fonction de votre configuration matérielle :

# sensor.set_hflip(True)
# sensor.set_hmirror(True)

Attendre la stabilité du capteur

redLED.on()
sensor.skip_frames(time = 100)
redLED.off()
blueLED.on()

Boucle principale

while(True):
    img = sensor.snapshot()

Détection et dessin de codes QR

for code in img.find_qrcodes():
    blueLED.on()
    print(code)

Affichage de l'orientation

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))

Intégration d'un capteur optionnel (commenté)

# distance = tof.read()
# imu_pitch = imu.pitch()
# imu_roll = imu.roll()
# temperature = imu.temperature_c()

Touche finale

blueLED.off()

Résumé

Ce script pose les bases d'un système embarqué basé sur la vision utilisant Nicla Vision qui peut :

Téléchargement


Dernière mise à jour : 23/04/2025