БъздавамС систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

БъздавамС систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV
OpenCV β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π΅Π½Π° Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π² областта Π½Π° ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π½ΠΎΡ‚ΠΎ Π·Ρ€Π΅Π½ΠΈΠ΅. Вя ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° Π²Π΅Ρ‡Π΅ ΠΎΠΊΠΎΠ»ΠΎ 20 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Ρ… я ΠΎΡ‰Π΅ Π² ΠΊΠΎΠ»Π΅ΠΆΠ° ΠΈ всС ΠΎΡ‰Π΅ я ΠΏΡ€ΠΈΠ»Π°Π³Π°ΠΌ Π·Π° ΠΌΠΎΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π½Π° C++ ΠΈ Python, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΈΠΌΠ° Π΄ΠΎΠ±Ρ€Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Ρ‚Π΅Π·ΠΈ Π΅Π·ΠΈΡ†ΠΈ.

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

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

НапомнямС: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° Β«Π₯Π°Π±Ρ€Π°Β» β€” ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС Π½Π° всСки курс Skillbox с ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄ Β«Π₯Π°Π±Ρ€Β».

Какво Π΅ Π½ΡƒΠΆΠ½ΠΎ:

  • Go;
  • OpenCV (Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ към инсталатора са ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ);
  • Π²Π΅Π±- ΠΈΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΠΌΠ΅Ρ€Π°.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π°

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

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

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

import (
β€œlog”
β€œ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.

window.IMShow(img)
window.WaitKey(50)

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

БъздавамС систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

ΠΏΠ°ΠΊΠ΅Ρ‚ основСн
 
ΠΈΠΌΠΏΠΎΡ€Ρ‚ (
"Π»ΠΎΠ³"
 
"gocv.io/x/gocv"
)
 
функция основСн() {
ΡƒΠ΅Π±ΠΊΠ°ΠΌΠ΅Ρ€Π°, Π³Ρ€Π΅ΡˆΠΊΠ° := gocv.VideoCaptureDevice(0)
Π°ΠΊΠΎ Π³Ρ€Π΅ΡˆΠΊΠ° != nil {
    Π»ΠΎΠ³.Fatalf("Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ отварянС Π½Π° устройството: %v", Π³Ρ€Π΅ΡˆΠΊΠ°)
}
ΠΎΡ‚Π»ΠΎΠΆΠΈ ΡƒΠ΅Π±ΠΊΠ°ΠΌΠ΅Ρ€Π°.Close()
 
ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ := gocv.NewMat()
ΠΎΡ‚Π»ΠΎΠΆΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.Close()
 
ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† := gocv.NewWindow("ΡƒΠ΅Π±ΠΊΠ°ΠΌΠ΅Ρ€Π°ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†")
ΠΎΡ‚Π»ΠΎΠΆΠΈ ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†.Close()
 
Π·Π° {
Π°ΠΊΠΎ ok := ΡƒΠ΅Π±ΠΊΠ°ΠΌΠ΅Ρ€Π°.Read(&ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅); !ok || ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.Empty() {
Π»ΠΎΠ³.Println("НСвъзмоТно Π΅ Π΄Π° сС Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚ ΡƒΠ΅Π±ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π°")
ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ
}
 
ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†.IMShow(ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅)
ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†.WaitKey(50)
}
}

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

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

ΠšΠ°ΡΠΊΠ°Π΄ΠΈΡ‚Π΅ Π₯Π°Π°Ρ€ са каскадни класификатори, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΎΠ±ΡƒΡ‡Π°Π²Π°Ρ‚ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈΡ‚Π΅ Π½Π° Π²Π΅ΠΉΠ²Π»Π΅Ρ‚ΠΈΡ‚Π΅ Π₯Π°Π°Ρ€. Π’Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ пиксСлитС Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π·Π° Π΄Π° открият ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°Ρ†ΠΈ. Π—Π° Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° каскадитС Π₯Π°Π°Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ ΠΏΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅Ρ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

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

Π‘Π²Π°Π»Π΅Ρ‚Π΅ Π²Π΅Ρ‡Π΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ каскади Ρ‚ΡƒΠΊ. Π’ тСкущия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ каскадитС Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π΅Ρ‚ΠΎ Π½Π° Ρ‡ΠΎΠ²Π΅ΠΊ Π² анфас.

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

harrcascade := "opencv_haarcascade_frontalface_default.xml"класификатор := gocv.NewCascadeClassifier()класификатор.Load(harrcascade)
ΠΎΡ‚Π»ΠΎΠΆΠΈ класификатор.Close()

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

Π·Π° _, r := Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ rects {
fmt.Println("ΠΎΡ‚ΠΊΡ€ΠΈΡ‚", r)
gocv.Rectangle(&ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, r, Ρ†Π²Π΅Ρ‚, 2)
}

БъздавамС систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

БъздавамС систСма Π·Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Golang ΠΈ OpenCV

ΠΏΠ°ΠΊΠ΅Ρ‚ основСн
 
ΠΈΠΌΠΏΠΎΡ€Ρ‚ (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
функция основСн() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ отварянС Π½Π° ΡƒΠ΅Π± ΠΊΠ°ΠΌΠ΅Ρ€Π°: %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.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("НСуспСх ΠΏΡ€ΠΈ Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΡ‚ устройството")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("ΠΎΡ‚ΠΊΡ€ΠΈΡ‚", r)
gocv.Rectangle(&img, r, Ρ†Π²Π΅Ρ‚Π΅Π½, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

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

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

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

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

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster