Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV
OpenCV Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π·Π° ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π½ΠΎ Π·Ρ€Π΅Π½ΠΈΠ΅. Вя Π²Π΅Ρ‡Π΅ Π΅ Π½Π° ΠΎΠΊΠΎΠ»ΠΎ 20 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Ρ… Π³ΠΎ Π² ΠΊΠΎΠ»Π΅ΠΆΠ° ΠΈ всС ΠΎΡ‰Π΅ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π·Π° ΠΌΠΎΠΈΡ‚Π΅ C++ ΠΈ Python ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΈΠΌΠ° Π΄ΠΎΠ±Ρ€Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Ρ‚Π΅Π·ΠΈ Π΅Π·ΠΈΡ†ΠΈ.

Но ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ… Π΄Π° ΡƒΡ‡Π° ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Go, сС заинтСрСсувах Π΄Π°Π»ΠΈ OpenCV ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚ΠΎΠ·ΠΈ Π΅Π·ΠΈΠΊ. По Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅ Π²Π΅Ρ‡Π΅ имашС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΈ ΡƒΡ€ΠΎΡ†ΠΈ Π·Π° интСграция, Π½ΠΎ ΠΌΠΈ сС сториха Ρ‚Π²ΡŠΡ€Π΄Π΅ слоТни. Малко ΠΏΠΎ-късно ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ… Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°, създадСна ΠΎΡ‚ Π΅ΠΊΠΈΠΏΠ° Π½Π° The Hybrid Group. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ с GoCV, ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ проста систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π° с Haar Cascades.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ курс β€žΠ Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° Python ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°β€œ.

НапомнямС Π²ΠΈ: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС във всСки курс Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ промоционалния ΠΊΠΎΠ΄ Π½Π° "Habr".

Какво Ρ‰Π΅ сС изисква:

  • ΠžΡ‚ΠΈΠ²Π°ΠΌ;
  • OpenCV (инсталационни Π²Ρ€ΡŠΠ·ΠΊΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ);
  • ΡƒΠ΅Π± ΠΈΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΠΌΠ΅Ρ€Π°.

Π˜Π½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Π’ ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° създадСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ отваря ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†, ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‰ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Π°.

ΠŸΡŠΡ€Π²ΠΎ трябва Π΄Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°.

внос (
"Π΄Π½Π΅Π²Π½ΠΈΠΊ"
β€žgocv.io/x/gocvβ€œ
)

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΎΠ±Π΅ΠΊΡ‚ VideoCapture с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията VideoCaptureDevice. ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ‚ Π΄Π°Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° заснСманС Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠ°ΠΌΠ΅Ρ€Π°. Ѐункцията ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° цяло число ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ (прСдставлява ID Π½Π° устройството).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(β€œerror opening web cam: %v”, err)
}
defer webcam.Close()

Π‘Π΅Π³Π° трябва Π΄Π° създадСм n-ΠΌΠ΅Ρ€Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°. Π’ΠΎΠΉ Ρ‰Π΅ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° изобраТСния, ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ΠΈ ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π°.

img := gocv.NewMat()
defer img.Close()

Π—Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† - Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° станС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията NewWindow.

window := gocv.NewWindow(β€œwebcamwindow”)
defer window.Close()

Π‘Π΅Π³Π° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Π½Π°ΠΉ-интСрСсната част.

Въй ΠΊΠ°Ρ‚ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ‚ΠΎ Π΅ Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ Ρ€Π°ΠΌΠΊΠΈ Π½Π° изобраТСния, Ρ‰Π΅ трябва Π΄Π° създадСм Π±Π΅Π·ΠΊΡ€Π°Π΅Π½ Ρ†ΠΈΠΊΡŠΠ», Π·Π° Π΄Π° Ρ‡Π΅Ρ‚Π΅ΠΌ Π±Π΅Π·ΠΊΡ€Π°ΠΉΠ½ΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π°. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Read ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° VideoCapture. Π’ΠΎΠΉ Ρ‰Π΅ ΠΎΡ‡Π°ΠΊΠ²Π° Ρ‚ΠΈΠΏ Mat (ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π°, която ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅), Π²Ρ€ΡŠΡ‰Π°Ρ‰Π° Π±ΡƒΠ»Π΅Π²Π° стойност, ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‰Π° Π΄Π°Π»ΠΈ Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° ΠΎΡ‚ VideoCapture Π΅ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(β€œUnable to read from the webcam”)    continue
     }
.
.
.
}

Π‘Π΅Π³Π° трябва Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Π² създадСния ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†. ΠŸΠ°ΡƒΠ·Π°Ρ‚Π° Π·Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ към слСдващия ΠΊΠ°Π΄ΡŠΡ€ Π΅ 50 ms.

ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†.IMShow(img)
window.WaitKey(50)

Π‘Π»Π΅Π΄ стартиранС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‰Π΅ сС ΠΎΡ‚Π²ΠΎΡ€ΠΈ ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† с Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π°.

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Π’ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° каскадитС Π½Π° Π₯Π°Π°Ρ€.

ΠšΠ°ΡΠΊΠ°Π΄ΠΈΡ‚Π΅ Π½Π° Haar са каскадни класификатори, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΎΠ±ΡƒΡ‡Π°Π²Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°Ρ‚Π° Π½Π° Haar wavelet. Π’Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ пиксСлитС Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π·Π° Π΄Π° открият ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ характСристики. Π—Π° Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Haar Cascades, моля, слСдвайтС Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

Π Π°ΠΌΠΊΠ° Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° Viola-Jones
Каскадни класификатори
Π₯арактСристика, ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° Π₯Π°Π°Ρ€

Π˜Π·Ρ‚Π΅Π³Π»Π΅Ρ‚Π΅ Π²Π΅Ρ‡Π΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈ каскади ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ‚ΡƒΠΊ. Π’ настоящия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ каскади Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π΅Ρ‚ΠΎ Π½Π° Ρ‡ΠΎΠ²Π΅ΠΊ ΠΎΡ‚ΠΏΡ€Π΅Π΄.

Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ класификатор ΠΈ Π΄Π° Π³ΠΎ Π·Π°Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ с Π²Π΅Ρ‡Π΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ Ρ„Π°ΠΉΠ» (Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π΅ Π΄Π°Π΄Π΅Π½Π° ΠΏΠΎ-Π³ΠΎΡ€Π΅). Π’Π΅Ρ‡Π΅ ΠΊΠ°Ρ‡ΠΈΡ… Ρ„Π°ΠΉΠ»Π° pencv_haarcascade_frontalface_default.xml Π² дирСкторията, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°.

harrcascade := β€œopencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Π—Π° Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅Ρ‚Π΅ Π»ΠΈΡ†Π° Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DetectMultiScale. Π’Π°Π·ΠΈ функция Π²Π·Π΅ΠΌΠ° Ρ€Π°ΠΌΠΊΠ° (Ρ‚ΠΈΠΏ Mat), която Ρ‚ΠΎΠΊΡƒ-Ρ‰ΠΎ Π΅ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½Π° ΠΎΡ‚ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π°, ΠΈ Π²Ρ€ΡŠΡ‰Π° масив ΠΎΡ‚ Ρ‚ΠΈΠΏ Rectangle. Π Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° масива прСдставлява броя Π½Π° Π»ΠΈΡ†Π°Ρ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΊΠ»Π°ΡΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΅ успял Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ‚Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° смС сигурни, Ρ‡Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΎ, Π½Π΅ΠΊΠ° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡ€Π΅Π· списъка с ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½ΠΈΡ†ΠΈ ΠΈ Π΄Π° ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ‚Π° Rectangle Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°, създавайки Π³Ρ€Π°Π½ΠΈΡ†Π° ΠΎΠΊΠΎΠ»ΠΎ открития ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½ΠΈΠΊ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° станС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията Rectangle. Π’ΠΎΠΉ Ρ‰Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ Mat, ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π°, ΠΎΠ±Π΅ΠΊΡ‚Π° Rectangle, Π²ΡŠΡ€Π½Π°Ρ‚ ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DetectMultiScale, Ρ†Π²Π΅Ρ‚Π° ΠΈ Π΄Π΅Π±Π΅Π»ΠΈΠ½Π°Ρ‚Π° Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ‚Π°.

for _, r := range rects {
fmt.Println(β€œdetected”, r)
gocv.Rectangle(&img, r, color, 2)
}

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

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

И... Π΄Π°, всичко сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ! Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ проста систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, написана Π½Π° Go. Π‘ΠΊΠΎΡ€ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ° с Ρ‚Π΅Π·ΠΈ СкспСримСнти ΠΈ Π΄Π° създам Π½ΠΎΠ²ΠΈ Π³ΠΎΡ‚ΠΈΠ½ΠΈ Π½Π΅Ρ‰Π°, ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌ Go ΠΈ OpenCV.

Ако сС интСрСсуватС, моля, ΠΎΡ†Π΅Π½Π΅Ρ‚Π΅ gRPC ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ написах Π² Python ΠΈ OpenCV. Π’ΠΎΠΉ ΠΏΡ€Π΅Π΄Π°Π²Π° Π΄Π°Π½Π½ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ бъдС Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎ Π»ΠΈΡ†Π΅. Π’ΠΎΠ²Π° Π΅ основата Π·Π° създаванС Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΅Π·ΠΈΡ†ΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅. Π’Π΅ Ρ‰Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‚ със ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ Π΄Π° Ρ‡Π΅Ρ‚Π°Ρ‚ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ.

Благодаря Π²ΠΈ, Ρ‡Π΅ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚ΠΎΡ…Ρ‚Π΅ статията!

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€