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