
OpenCV β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½Π° Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ½ΠΎΡΠΎ Π·ΡΠ΅Π½ΠΈΠ΅. Π’Ρ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π²Π΅ΡΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 20 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
Ρ ΠΎΡΠ΅ Π² ΠΊΠΎΠ»Π΅ΠΆΠ° ΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Ρ ΠΏΡΠΈΠ»Π°Π³Π°ΠΌ Π·Π° ΠΌΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π½Π° C++ ΠΈ Python, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ° Π΄ΠΎΠ±ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ΅Π·ΠΈ Π΅Π·ΠΈΡΠΈ.
ΠΠΎ ΠΊΠΎΠ³Π°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π°Ρ
Π΄Π° ΠΈΠ·ΡΡΠ°Π²Π°ΠΌ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Go, ΠΌΠΈ ΡΡΠ°Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π°Π»ΠΈ ΠΌΠΎΠ³Π° Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ° OpenCV Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΎΠ·ΠΈ Π΅Π·ΠΈΠΊ. ΠΠ΅ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΈ ΡΡΠΎΡΠΈ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, Π½ΠΎ ΠΌΠΈ ΡΠ΅ ΡΡΠΎΡΠΈ, ΡΠ΅ ΡΠ° ΡΠ²ΡΡΠ΄Π΅ ΡΠ»ΠΎΠΆΠ½ΠΈ. ΠΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ
Π½Π° Π²ΡΠ°ΠΏΡΡ, ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΎΡ Π΅ΠΊΠΈΠΏΠ° Π½Π° The Hybrid Group. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ GoCV, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡΠ° Ρ ΠΊΠ°ΡΠΊΠ°Π΄ΠΈ Π½Π° Π₯Π°Π°Ρ (Haar Cascades).
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ .
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° Β«Π₯Π°Π±ΡΠ°Β» β ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox Ρ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄ Β«Π₯Π°Π±ΡΒ».
ΠΠ°ΠΊΠ²ΠΎ Π΅ Π½ΡΠΆΠ½ΠΎ:
- Go;
- OpenCV (Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ ΠΊΡΠΌ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΎΡΠ° ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ);
- Π²Π΅Π±- ΠΈΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΠΌΠ΅ΡΠ°.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π°
- Linux:
- macOS:
- Windows:
ΠΡΠΈΠΌΠ΅Ρ 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)
Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Ρ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡΠΎΠΊ ΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΠ°ΡΠ°.

ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π΅Π½
ΠΈΠΌΠΏΠΎΡΡ (
"Π»ΠΎΠ³"
"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
Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ΠΊΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡΠ°, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° ΠΊΠ°ΡΠΊΠ°Π΄ΠΈ Π₯Π°Π°Ρ.
ΠΠ°ΡΠΊΠ°Π΄ΠΈΡΠ΅ Π₯Π°Π°Ρ ΡΠ° ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΈ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΎΠ±ΡΡΠ°Π²Π°Ρ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠ΅Ρ Π½ΠΈΠΊΠΈΡΠ΅ Π½Π° Π²Π΅ΠΉΠ²Π»Π΅ΡΠΈΡΠ΅ Π₯Π°Π°Ρ. Π’Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΏΠΈΠΊΡΠ΅Π»ΠΈΡΠ΅ Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π·Π° Π΄Π° ΠΎΡΠΊΡΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΈΠ·Π½Π°ΡΠΈ. ΠΠ° Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΊΠ°ΡΠΊΠ°Π΄ΠΈΡΠ΅ Π₯Π°Π°Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΏΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
Π‘Π²Π°Π»Π΅ΡΠ΅ Π²Π΅ΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡΠ΅ ΠΊΠ°ΡΠΊΠ°Π΄ΠΈ . Π ΡΠ΅ΠΊΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΡΠΊΠ°Π΄ΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° Π»ΠΈΡΠ΅ΡΠΎ Π½Π° ΡΠΎΠ²Π΅ΠΊ Π² Π°Π½ΡΠ°Ρ.
ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈ Π΄Π° ΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π²Π΅ΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ ΡΠ°ΠΉΠ» (ΠΏΠΎ-Π³ΠΎΡΠ΅ Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ Π»ΠΈΠ½ΠΊ). ΠΠ· Π²Π΅ΡΠ΅ Π·Π°ΡΠ΅Π΄ΠΈΡ ΡΠ°ΠΉΠ»Π° opencv_haarcascade_frontalface_default.xml Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.
harrcascade := "opencv_haarcascade_frontalface_default.xml"ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ := gocv.NewCascadeClassifier()ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ.Load(harrcascade)
ΠΎΡΠ»ΠΎΠΆΠΈ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ.Close()ΠΠ° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π»ΠΈΡΠ° Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° . Π’Π°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ΅ΠΌΠ° ΠΊΠ°Π΄ΡΡ (ΡΠΈΠΏ Mat), ΠΊΠΎΠΉΡΠΎ Π΅ Π±ΠΈΠ» ΡΠΎΠΊΡ-ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ ΠΎΡ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡΠΎΠΊΠ° Π½Π° ΠΊΠ°ΠΌΠ΅ΡΠ°ΡΠ°, ΠΈ Π²ΡΡΡΠ° ΠΌΠ°ΡΠΈΠ² ΠΎΡ ΡΠΈΠΏΠ° Rectangle. Π Π°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΠΌΠ°ΡΠΈΠ²Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π»ΠΈΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Π΅ ΡΡΠΏΡΠ» Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ Π² ΠΊΠ°Π΄ΡΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, Π·Π° Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠΎΠΉ Π΅ Π½Π°ΠΌΠ΅ΡΠΈΠ», Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠ°Π²ΠΎΡΠ³ΡΠ»Π½ΠΈΡΠΈΡΠ΅ ΠΈ Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ ΠΎΠ±Π΅ΠΊΡΠ° Rectangle Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°, ΡΡΠ·Π΄Π°Π²Π°ΠΉΠΊΠΈ Π³ΡΠ°Π½ΠΈΡΠ° ΠΎΠΊΠΎΠ»ΠΎ ΠΎΡΠΊΡΠΈΡΠΈΡ ΠΏΡΠ°Π²ΠΎΡΠ³ΡΠ»Π½ΠΈΠΊ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Rectangle. Π’Ρ ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ° Mat, ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ ΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΠ°ΡΠ°, ΠΎΠ±Π΅ΠΊΡ Rectangle, ΠΊΠΎΠΉΡΠΎ Π΅ Π±ΠΈΠ» Π²ΡΡΠ½Π°Ρ ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° DetectMultiScale, ΡΠ²ΡΡ ΠΈ Π΄Π΅Π±Π΅Π»ΠΈΠ½Π° Π·Π° Π³ΡΠ°Π½ΠΈΡΠ°ΡΠ°.
Π·Π° _, r := Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ rects {
fmt.Println("ΠΎΡΠΊΡΠΈΡ", r)
gocv.Rectangle(&ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, r, ΡΠ²Π΅Ρ, 2)
} 

ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π΅Π½
ΠΈΠΌΠΏΠΎΡΡ (
"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.
ΠΠΊΠΎ Π²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°, ΠΎΡΠ΅Π½Π΅ΡΠ΅ , ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ Π½Π° Python ΠΈ OpenCV. Π’ΠΎΠΉ ΠΏΡΠ΅Π΄Π°Π²Π° Π΄Π°Π½Π½ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΎΡΠΊΡΠΈΡΠΈΠ΅ Π½Π° Π»ΠΈΡΠ΅. Π’ΠΎΠ²Π° Π΅ ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ. Π’Π΅ ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ ΡΡΡ ΡΡΡΠ²ΡΡΠ° ΠΈ Π΄Π° ΡΠ΅ΡΠ°Ρ ΠΎΡ Π½Π΅Π³ΠΎ Π΄Π°Π½Π½ΠΈ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ, ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠ°!
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΠ²ΡΠ³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ .
- ΠΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»Π΅Π½ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ .
- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
