Reconnaissance de formes avec caméra Raspberry

Bonjour à tous,
j’ai pour projet de reconnaître des formes au moyen de la caméra Raspberry Pi. Je me suis aidé d’un programme trouvé sur le net qui fonctionne parfaitement avec des images diverses. Cependant, l’histoire se complique avec une prise de photos de la caméra. Le programme croit tout le temps reconnaître un rectangle. Voici le code du programme de reconnaissance avec la caméra :

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

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.95 and ratio <= 1.05:
            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()

Voilà où j’en suis pour le moment. Donc si vous avez des solutions ou des alternatives je suis preneur !
Merci de votre aide !

Salut,
On va siffler @stef-k qui gère un peu le truc avec OpenCV :wink:
Mais je crois qu’il fait de la reconnaissance en temps réel et pas sur prise de cliché.
++

Super merci beaucoup ! Et oui la reconnaissance en temps réel ferait très bien l’affaire ^^

Salut,

Lectures utiles :

Bonjour,

A tout hasard, il n’y aurait pas un problème de contraste et se serait toute la photo qui serait prise en compte ?

Bon courage.

A+

Quel est le problème avec le conteste ?

*contraste pardon, le correcteur

Salut,

Vous avez essayé en prenant des photos au format JPEG, avec la PiCam?
Une fois les images capturées, placez les dans votre répertoire « PhotoReconnaissance »

Ensuite, modifiez la ligne :

camera.capture('/home/pi/Camera/PhotoReconnaissance/image.bmp')
par
camera.capture('/home/pi/Camera/PhotoReconnaissance/image.jpg')

De même avec la ligne : 

image = cv2.imread('/home/pi/Camera/PhotoReconnaissance/image.bmp',0)
par
image = cv2.imread('/home/pi/Camera/PhotoReconnaissance/image.jpg',0)

@++


Le format de la photo a donc son importance ? Quel est la différence entre bmp et jpg ?
En tout cas merci de vos réponses !

J’ai testé, et ce n’est toujours pas concluant …

Salut,

En gros,
BMP, c’est un format microsoft de dessin matriciel
JPEG est un format (une norme) de compression d’image.

++

D´accord merci !
J’ai donc testé, mais apparemment changer l’extension ne résoud pas le problème :thinking:

Je suis encore en galère :sweat_smile:
Je remets le code avec avec l’extension .jpg :

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.jpg')
camera.stop_preview()

image = cv2.imread('/home/pi/Camera/PhotoReconnaissance/image.jpg',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()

Et voilà après test le genre de résultat aberrant que j’obtiens :