Reconnaissance de formes (en galère)


#1

Bonjour à tous !
Je viens pour me renseigner sur la reconnaissance de formes. L’objectif pour moi serait de reconnaître des formes simples tel qu’un cube ou une sphère. Pour ce faire, je me suis renseigner sur divers sites pour réussir à constituer le code suivant (pymotion m’a beaucoup aidé). Le programme est censé pouvoir reconnaître formes et couleurs de photos prise par la caméra Raspberry. Le couleur fonctionne très bien, mais pas la reconnaissance de formes. En effet, le code ne détecte rien sur l’image et prend (par défaut j’imagine) toute la photo pour en déduire que la forme est un rectangle :expressionless:

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

colors={"Rouge1":[0,20],
        "Orange":[20,40],
        "Jaune":[40,80],
        "Vert":[80,160],
        "Cyan":[160,200],
        "Bleu":[200,260],
        "Magenta":[260,330],
        "Rouge2":[330,360]
        }
 
def detect_couleur(image,cnt,colors):
    image_hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
    mask = np.zeros(image_hsv.shape[:2], dtype="uint8")
    cv2.imshow('image',mask)
    cv2.waitKey(0)
    cv2.drawContours(mask, [cnt], -1, 255, -1)
    mask = cv2.erode(mask, None, iterations=2)
    mean = cv2.mean(image_hsv, mask=mask)
    if image.dtype=='uint8':
        for color in colors:
            if int(2*mean[0]) in range(colors[color][0],colors[color][1]):
                return(color)
    else:
        for color in colors:
            if int(mean[0]) in range(colors[color][0],colors[color][1]):
                return(color)

# Supression de l'image précédente dans le fichier
file = os.listdir('/home/pi/Camera/PhotoReconnaissanceColor')
os.remove('/home/pi/Camera/PhotoReconnaissanceColor'+'/'+file[0])
camera = picamera.PiCamera()
camera.start_preview(fullscreen = False, window=(50,50,640,480))
time.sleep(5)
# Photo prise
camera.capture('/home/pi/Camera/PhotoReconnaissanceColor/image.jpg')
camera.stop_preview()

image = cv2.imread('/home/pi/Camera/PhotoReconnaissanceColor/image.jpg')
cv2.imshow('image',image)
cv2.waitKey(0)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('image',gray)
cv2.waitKey(0)
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)
    color = detect_couleur(image,cnt,colors)
    M = cv2.moments(cnt)
    if M["m00"] != 0:
        cX = int(M["m10"] / M["m00"])
        cY = int(M["m01"] / M["m00"])
    else:
        cX, cY = 0, 0
    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 + "" + color, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,0.5, (125, 125, 125), 2)
cv2.imshow('image',image)
cv2.waitKey(5000)
cv2.imwrite('result.jpg',image)
cv2.destroyAllWindows()

Pourriez-vous donc m’aider, je pense ne pas être très loin de la solution.
Merci !


#2

Déjà posté ? :thinking:


#4

Oui mais j’ai perdu la discussion (je suis nouveau désolé :sweat_smile:)
Et j’ai réussi à un petit peu avancer. Mais je n’arrive toujours pas à la reconnaissance de formes et je désespère d’y arriver :confused:
Mais si vous savez d’ou vient le problème vous m’aideriez grandement
Merci.