Reconnaissance avec caméra Raspberry

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

Répondre
Mat0s
Messages : 1
Enregistré le : ven. 5 avr. 2019 17:59

Reconnaissance avec caméra Raspberry

Message par Mat0s » ven. 5 avr. 2019 18:06

Bonjour à tous,
j'aurais besoin d'aide pour réaliser une reconnaissance de formes grâce à la caméra du Raspberry Pi. Je m'explique, j'utilise la caméra basique du Raspberry, et il faudrais qu'elle prenne une photo, puis l'analyse pour en déduire les formes présentes. Pour ce faire, j'ai trouvé quelques programmes utiles sur internet et ai cru comprendre qu'il était judicieux d'utilisé cv2. Sur la base de ce que j'ai déniché j'ai obtenu le code suivant :

Code : Tout sélectionner

# Imports
import picamera
import time
import os
import numpy as np
import cv2

# Supression de l'image précédente dans le fichier
file = os.listdir('/home/pi/Camera/PhotoReconnaissance')
os.remove('/home/pi/Camera/PhotoReconnaissance'+'/'+file[0])
camera = picamera.PiCamera()
#camera.resolution = (720,1080)

camera.start_preview(fullscreen = False, window=(50,50,640,480))
time.sleep(5)
# Photo prise
camera.capture('/home/pi/Camera/PhotoReconnaissance/image.bmp')
camera.stop_preview()
# Récpération de l'image prise
image = cv2.imread('/home/pi/Camera/PhotoReconnaissance/image.bmp',0)
gray = image
ret,thresh = cv2.threshold(gray,250,255,cv2.THRESH_BINARY_INV)
img,contours,h =cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    perimetre=cv2.arcLength(cnt,True)
    approx = cv2.approxPolyDP(cnt,0.01*perimetre,True)
    
    M = cv2.moments(cnt)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
    cv2.drawContours(image,[cnt],-1,(0,255,0),2)
    if len(approx)==3:
        shape = "triangle"
    elif len(approx)==4:
        (x, y, w, h) = cv2.boundingRect(approx)
        ratio = w / float(h)
        if ratio >= 0.70 and ratio <= 1.30:
            shape = "carre"
        else:
            shape = "rectangle"
    elif len(approx)==5:
        shape = "pentagone"
    elif len(approx)==6:
        shape = "hexagone"
    else:
        shape= "circle"
    cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255), 2)
image_data = np.asarray(image)
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
J'ai déjà un code qui fonctionne très bien avec des images prises sur internet avec des contours nets. Le problème est l'intégration de la caméra. L'exécution de ce code renvoi toujours "rectangle", peu importe la forme. Je précise que l'image doit avoir un fond blanc pour fonctionner. Je ne sais pas exactement comment fonctionne cv2. Si vous avez des solutions, je suis preneur ! Sinon, existerait-il des alternatives équivalentes avec une simple reconnaissance de couleurs ?
Mon projet consiste à pouvoir reconnaître des formes simples. Ainsi, un cube vu de face sera vu comme un carré et identifié comme il le faut. Mais les couleurs peuvent très bien faire l'affaire avec des formes qui auraient leur couleur propre.
Merci de votre aide !

Répondre

Retourner vers « Utilisateurs avancés »