blender-edutech-tutoriels/labyrinthe/6-jumeaux/test/cam_bille-test.py

73 lines
2.6 KiB
Python

import os, time
import numpy as np
import cv2 as cv
###############################################################################
# cam_bille-test.py :
# @title: Détection de la bille par vision (caméra + OpenCV)
# @project: Blender-EduTech - Tutoriel : Tutoriel 6 : Labyrinthe à bille - Développement de jumeau numérique
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2023 Philippe Roy
# @license: GNU GPL
###############################################################################
###
# Installation :
# - pip3 install opencv-python
###
###############################################################################
# Initialisation
###############################################################################
# Init de la caméra
cam_id = 0 # 0 pour la 1ere camera, 1 pour la seconde ...
cam = cv.VideoCapture(cam_id) # 0 pour la 1ere camera, 1 pour la
assert cam.isOpened(), "Erreur lors de l'ouverture de la camera !"
# Création de la fenêtre d'affichage
# cv.namedWindow("Caméra")
###############################################################################
# Affichage
###############################################################################
# Capture vidéo
echap=''
while cam.isOpened():
cam_actif, cam_img = cam.read()
cam_gray = cv.cvtColor(cam_img, cv.COLOR_BGR2GRAY)
cam_gray = cv.medianBlur(cam_gray, 5)
# (thresh, cam_bw) = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
rows = cam_gray.shape[0]
cercles = cv.HoughCircles(cam_gray, cv.HOUGH_GRADIENT, 1.5, rows / 8, param1=100, param2=30, minRadius=2, maxRadius=10)
# cercles = cv.HoughCircles(cam_gray, cv.HOUGH_GRADIENT, 1, rows / 8, param1=100, param2=30, minRadius=5, maxRadius=10)
# Dessin de la zone de détection
# Détection de la bille
if cercles is not None:
cercles = np.uint16(np.around(cercles))
for i in cercles[0, :]:
centre = (i[0], i[1])
cv.circle(cam_img, centre, 1, (0, 100, 100), 3) # Point des centres
rayon = i[2]
print ("Rayon :", rayon, "- Centre :", centre)
cv.circle(cam_img, centre, rayon, (255, 0, 255), 3) # Contour des cercles
cv.imshow("Detection de cercles", cam_img) # "Détection" -> bug !
# cv.imwrite("camera.png", cam_img) # Enregister l'image
# Sortir
echap = cv.waitKey(1) # Saisie clavier avec un timeout de 1 ms
if echap & 0xFF == ord('q') or echap == 27 :
break
###############################################################################
# Quitter
###############################################################################
cam.release()
cv.destroyAllWindows()