Nota
Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 con altri appassionati.
Perché unirti a noi?
Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime Esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime.
Sconti Speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.
Promozioni Festive e Giveaway: Partecipa a promozioni e concorsi durante le festività.
👉 Pronto a esplorare e creare con noi? Clicca [qui] e unisciti oggi stesso!
5. Visione Artificiale
In questo progetto, entreremo ufficialmente nel campo della visione artificiale!
Esegui il Codice
cd ~/picrawler/examples
sudo python3 5_display.py
Visualizza l’Immagine
Dopo aver eseguito il codice, il terminale mostrerà il seguente messaggio:
No desktop !
* Serving Flask app "vilib.vilib" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)
Puoi quindi inserire http://<il tuo IP>:9000/mjpg nel browser per visualizzare il feed video, ad esempio: http://192.168.18.113:9000/mjpg
Dopo l’avvio del programma, vedrai le seguenti informazioni:
Inserisci un tasto per attivare la funzione!
q: Scatta una foto1: Rileva colore: rosso2: Rileva colore: arancione3: Rileva colore: giallo4: Rileva colore: verde5: Rileva colore: blu6: Rileva colore: viola0: Disattiva rilevamento colorir: Scansiona il codice QRf: Attiva/Disattiva rilevamento voltis: Mostra informazioni sugli oggetti rilevati
Segui i suggerimenti per attivare le funzioni corrispondenti.
Scatta Foto
Digita
qnel terminale. L’immagine attualmente visibile dalla fotocamera sarà salvata (se il rilevamento del colore è attivato, la casella di marcatura apparirà anche nella foto salvata). Puoi trovare queste foto nella directory~/Pictures/PiCrawler/del Raspberry Pi. Puoi usare strumenti come Software FileZilla per trasferire le foto sul tuo PC.Rileva Colore
Inserendo un numero tra
1~6rileverai uno dei colori «rosso, arancione, giallo, verde, blu, viola». Inserisci0per disattivare il rilevamento del colore.![]()
Nota
Puoi scaricare e stampare le
Carte dei Colori PDFper il rilevamento dei colori.Rileva Volto
Digita
fper attivare il rilevamento del volto.![]()
Rileva Codice QR
Inserisci
rper avviare il riconoscimento del codice QR. Nessuna altra operazione può essere eseguita finché il codice QR non è stato riconosciuto. Le informazioni decodificate del codice QR saranno stampate nel terminale.![]()
Mostra Informazioni
Inserendo
sverranno stampate nel terminale le informazioni sul volto rilevato (e sull’oggetto rilevato). Incluse le coordinate centrali (X, Y) e la dimensione (Larghezza, Altezza) dell’oggetto misurato.
Codice
from vilib import Vilib
from time import sleep, time, strftime, localtime
import threading
import readchar
from os import getlogin
USERNAME = getlogin()
PICTURE_PATH = f"/home/{USERNAME}/Pictures/"
flag_face = False
flag_color = False
qr_code_flag = False
MANUAL = '''
Press a key to call the function:
q: Take photo
1: Color detect : red
2: Color detect : orange
3: Color detect : yellow
4: Color detect : green
5: Color detect : blue
6: Color detect : purple
0: Switch off Color detect
r: Scan the QR code (toggle)
f: Switch ON/OFF face detect
s: Display detected object information
Ctrl+C: Quit
'''
color_list = ['close', 'red', 'orange', 'yellow', 'green', 'blue', 'purple']
def face_detect(flag):
print("Face Detect:", flag)
Vilib.face_detect_switch(flag)
def qrcode_detect():
global qr_code_flag
Vilib.qrcode_detect_switch(True)
print("Waiting for QR code...")
text = None
while qr_code_flag:
temp = Vilib.detect_obj_parameter.get('qr_data', "None")
if temp != "None" and temp != text:
text = temp
print("QR code:", text)
sleep(0.2)
Vilib.qrcode_detect_switch(False)
def take_photo():
_time = strftime('%Y-%m-%d-%H-%M-%S', localtime(time()))
name = f'photo_{_time}'
Vilib.take_photo(name, PICTURE_PATH)
print(f'Photo saved as {PICTURE_PATH}{name}.jpg')
def object_show():
global flag_color, flag_face
if flag_color:
if Vilib.detect_obj_parameter.get('color_n', 0) == 0:
print('Color Detect: None')
else:
x = Vilib.detect_obj_parameter.get('color_x')
y = Vilib.detect_obj_parameter.get('color_y')
w = Vilib.detect_obj_parameter.get('color_w')
h = Vilib.detect_obj_parameter.get('color_h')
print("[Color Detect] Coordinate:", (x, y), "Size:", (w, h))
if flag_face:
if Vilib.detect_obj_parameter.get('human_n', 0) == 0:
print('Face Detect: None')
else:
x = Vilib.detect_obj_parameter.get('human_x')
y = Vilib.detect_obj_parameter.get('human_y')
w = Vilib.detect_obj_parameter.get('human_w')
h = Vilib.detect_obj_parameter.get('human_h')
print("[Face Detect] Coordinate:", (x, y), "Size:", (w, h))
def main():
global flag_face, flag_color, qr_code_flag
qrcode_thread = None
Vilib.camera_start(vflip=False, hflip=False)
Vilib.display(local=True, web=True)
print(MANUAL)
try:
while True:
key = readchar.readkey().lower()
if key == 'q':
take_photo()
elif key in '0123456':
index = int(key)
if index == 0:
flag_color = False
Vilib.color_detect('close')
else:
flag_color = True
Vilib.color_detect(color_list[index])
print('Color detect:', color_list[index])
elif key == 'f':
flag_face = not flag_face
face_detect(flag_face)
elif key == 'r':
qr_code_flag = not qr_code_flag
if qr_code_flag:
if qrcode_thread is None or not qrcode_thread.is_alive():
qrcode_thread = threading.Thread(target=qrcode_detect, daemon=True)
qrcode_thread.start()
else:
print('QRcode Detect: close')
elif key == 's':
object_show()
sleep(0.05)
except KeyboardInterrupt:
print("\nQuit.")
finally:
# Stop QR thread and switches
qr_code_flag = False
try:
Vilib.qrcode_detect_switch(False)
except Exception:
pass
try:
Vilib.color_detect('close')
except Exception:
pass
try:
Vilib.face_detect_switch(False)
except Exception:
pass
# Close camera
try:
Vilib.camera_close()
except Exception:
pass
if __name__ == "__main__":
main()
Come Funziona?
La parte fondamentale è l’avvio della fotocamera e il display:
Vilib.camera_start()
Vilib.display()
Funzioni correlate alla «rilevazione degli oggetti»:
Vilib.face_detect_switch(True): Attiva/Disattiva il rilevamento voltiVilib.color_detect(color): Rileva un colore, specifica tra"rosso","arancione","giallo","verde","blu","viola"Vilib.color_detect_switch(False): Disattiva rilevamento coloriVilib.qrcode_detect_switch(False): Attiva/Disattiva il rilevamento QR codeVilib.gesture_detect_switch(False): Attiva/Disattiva rilevamento gestiVilib.traffic_sign_detect_switch(False): Attiva/Disattiva rilevamento segnali stradali
Informazioni rilevate archiviate nel dizionario detect_obj_parameter = Manager().dict().
Esempio d’uso:
Vilib.detect_obj_parameter['color_x']
Chiavi del dizionario e loro utilizzo:
color_x: il valore x della coordinata centrale del blocco di colore rilevato, con un intervallo di 0~320color_y: il valore y della coordinata centrale del blocco di colore rilevato, con un intervallo di 0~240color_w: la larghezza del blocco di colore rilevato, con un intervallo di 0~320color_h: l’altezza del blocco di colore rilevato, con un intervallo di 0~240color_n: il numero di blocchi di colore rilevatihuman_x: il valore x della coordinata centrale del volto umano rilevato, con un intervallo di 0~320human_y: il valore y della coordinata centrale del volto umano rilevato, con un intervallo di 0~240human_w: la larghezza del volto umano rilevato, con un intervallo di 0~320human_h: l’altezza del volto umano rilevato, con un intervallo di 0~240human_n: il numero di volti rilevatitraffic_sign_x: il valore x della coordinata centrale del segnale stradale rilevato, con un intervallo di 0~320traffic_sign_y: il valore y della coordinata centrale del segnale stradale rilevato, con un intervallo di 0~240traffic_sign_w: la larghezza del segnale stradale rilevato, con un intervallo di 0~320traffic_sign_h: l’altezza del segnale stradale rilevato, con un intervallo di 0~240traffic_sign_t: il contenuto del segnale stradale rilevato; l’elenco dei valori è [“stop”,”right”,”left”,”forward”]gesture_x: il valore x della coordinata centrale del gesto rilevato, con un intervallo di 0~320gesture_y: il valore y della coordinata centrale del gesto rilevato, con un intervallo di 0~240gesture_w: la larghezza del gesto rilevato, con un intervallo di 0~320gesture_h: l’altezza del gesto rilevato, con un intervallo di 0~240gesture_t: il contenuto del gesto rilevato; l’elenco dei valori è [«paper»,»scissor»,»rock»]qr_date: il contenuto del codice QR rilevatoqr_x: il valore x della coordinata centrale del codice QR rilevato, con un intervallo di 0~320qr_y: il valore y della coordinata centrale del codice QR rilevato, con un intervallo di 0~240qr_w: la larghezza del codice QR rilevato, con un intervallo di 0~320qr_h: l’altezza del codice QR rilevato, con un intervallo di 0~320