OpenCV est une bibliothÚque conçue pour les projets de vision par ordinateur. Elle a déjà environ 20 ans. Je l'ai utilisé à l'université et je l'utilise toujours pour mes projets en C ++ et Python, car il supporte bien ces langages.
Mais quand j'ai commencĂ© Ă apprendre et Ă utiliser Go, je me suis demandĂ© si OpenCV pouvait ĂȘtre utilisĂ© pour travailler avec ce langage. A cette Ă©poque, il y avait dĂ©jĂ des exemples et des tutoriels sur l'intĂ©gration, mais il me semblait qu'ils Ă©taient trop compliquĂ©s. Un peu plus tard, je suis tombĂ© sur un wrapper créé par l'Ă©quipe de The Hybrid Group. Dans cet article, je vais vous montrer comment dĂ©marrer avec GoCV en dĂ©veloppant un systĂšme de reconnaissance faciale simple avec Haar Cascades.
Skillbox recommande: Le cours pratique de Python Developer from scratch .
Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».
Ce qui est requis:- Allez;
- OpenCV (liens d'installation ci-dessous);
- Web ou caméscope conventionnel.
L'installationExemple 1
Dans le premier exemple, nous allons essayer de crĂ©er une application qui ouvre une fenĂȘtre avec une dĂ©monstration du flux vidĂ©o de la camĂ©ra.
Vous devez d'abord importer les bibliothĂšques dont vous avez besoin pour travailler.
importer (
«Journal»
"Gocv.io/x/gocv"
)AprÚs cela, vous devez créer un objet VideoCapture à l'aide de la fonction VideoCaptureDevice. Ce dernier permet de capturer le flux vidéo à l'aide de la caméra. La fonction utilise un entier comme paramÚtre (il représente l'ID du périphérique).
webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf(âerror opening web cam: %vâ, err) } defer webcam.Close()
Vous devez maintenant créer une matrice à n dimensions. Il stockera les images lues sur l'appareil photo.
img := gocv.NewMat() defer img.Close()
Pour afficher le flux vidĂ©o, vous devez crĂ©er une fenĂȘtre - cela peut ĂȘtre fait en utilisant la fonction NewWindow.
window := gocv.NewWindow(âwebcamwindowâ) defer window.Close()
Passons maintenant à la partie la plus intéressante.
Ătant donnĂ© que la vidĂ©o est un flux continu d'images, nous devrons crĂ©er une boucle sans fin pour lire le flux vidĂ©o de la camĂ©ra Ă l'infini. Pour ce faire, vous avez besoin de la mĂ©thode Read de type VideoCapture. Il attendra le type Mat (la matrice que nous avons créée ci-dessus), renvoyant une valeur boolĂ©enne indiquant si l'image de VideoCapture a Ă©tĂ© lue avec succĂšs ou non.
for { if ok := webcam.Read(&img); !ok || img.Empty( { log.Println(âUnable to read from the webcamâ) continue } . . . }
Vous devez maintenant afficher le cadre dans la fenĂȘtre créée. Pause pour passer Ă l'image suivante - 50 ms.
window.IMShow (img)
window.WaitKey (50)AprĂšs avoir dĂ©marrĂ© l'application, une fenĂȘtre avec un flux vidĂ©o de la camĂ©ra s'ouvrira.

package main import ( "log" "gocv.io/x/gocv" ) func main() { webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf("error opening device: %v", err) } defer webcam.Close() img := gocv.NewMat() defer img.Close() window := gocv.NewWindow("webcamwindow") defer window.Close() for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println("Unable to read from the webcam") continue } window.IMShow(img) window.WaitKey(50) } }
Exemple 2
Dans cet exemple, utilisons l'exemple précédent et construisons un systÚme de reconnaissance faciale basé sur Haar Cascades (Haar cascades).
Les cascades de Haar sont des classificateurs en cascade qui sont formés sur la base de la technique des ondelettes de Haar. Ils analysent les pixels de l'image pour détecter certains signes. Pour en savoir plus sur Haar Cascades, suivez les liens ci-dessous.
Cadre de détection d'objets Viola-jonesClassificateurs en cascadeFonction de type haarVous
pouvez télécharger des cascades déjà formées
ici . Dans l'exemple actuel, les cascades seront utilisées pour identifier le visage d'une personne face à face.
Pour ce faire, vous devez crĂ©er un classificateur et lui fournir un fichier dĂ©jĂ formĂ© (le lien ci-dessus est donnĂ©). J'ai dĂ©jĂ tĂ©lĂ©chargĂ© le fichier pencv_haarcascade_frontalface_default.xml dans le rĂ©pertoire oĂč se trouve notre programme.
harrcascade := âopencv_haarcascade_frontalface_default.xmlâclassifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade) defer classifier.Close()
Pour détecter des visages dans l'image, vous devez utiliser la méthode
DetectMultiScale . Cette fonction prend une image (type Mat) qui vient d'ĂȘtre lue dans le flux vidĂ©o de la camĂ©ra et renvoie un tableau de type Rectangle. La taille du tableau reprĂ©sente le nombre de faces que le classificateur a pu dĂ©tecter dans le cadre. Ensuite, pour nous assurer de voir ce qu'il a trouvĂ©, parcourons la liste des rectangles et affichons l'objet Rectangle sur la console, crĂ©ant une bordure autour du rectangle dĂ©tectĂ©. Cela peut ĂȘtre fait en utilisant la fonction Rectangle. Il faudra le tapis lu par la camĂ©ra, l'objet Rectangle retournĂ© par la mĂ©thode DetectMultiScale, la couleur et l'Ă©paisseur de la bordure.
for _, r := range rects { fmt.Println(âdetectedâ, r) gocv.Rectangle(&img, r, color, 2) }


package main import ( "fmt" "image/color" "log" "gocv.io/x/gocv" ) func main() { webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf("error opening web cam: %v", err) } defer webcam.Close() img := gocv.NewMat() defer img.Close() window := gocv.NewWindow("webcamwindow") defer window.Close() harrcascade := "opencv_haarcascade_frontalface_default.xml" classifier := gocv.NewCascadeClassifier() classifier.Load(harrcascade) defer classifier.Close() color := color.RGBA{0, 255, 0, 0} for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println("Unable to read from the device") continue } rects := classifier.DetectMultiScale(img) for _, r := range rects { fmt.Println("detected", r) gocv.Rectangle(&img, r, color, 3) } window.IMShow(img) window.WaitKey(50) } }
Et ... oui, ça a marché! Nous avons maintenant un systÚme de reconnaissance faciale simple écrit en Go. Dans un avenir proche, je prévois de poursuivre ces expériences et de créer de nouvelles choses sympas, combinant Go et OpenCV.
Si vous ĂȘtes intĂ©ressĂ©,
consultez le serveur Web gRPC , que j'ai écrit en Python et OpenCV. Il diffuse des données au moment de la détection de visage. C'est la base pour créer différents clients dans différents langages de programmation. Ils pourront se connecter au serveur et y lire des données.
Merci d'avoir lu l'article!
Skillbox recommande: