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

Π˜Π·Π³Ρ€Π°Π΄Π±Π° Π½Π° систСм Π·Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ Π»ΠΈΡ†Π° Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° Golang ΠΈ OpenCV
OpenCV Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½Π° Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π·Π° ΠΊΠΎΠΌΠΏΡ˜ΡƒΡ‚Π΅Ρ€ΡΠΊΠ° визија. Π’Π°Π° вСќС ΠΈΠΌΠ° ΠΎΠΊΠΎΠ»Ρƒ 20 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. Π“ΠΎ користСв Π½Π° Ρ„Π°ΠΊΡƒΠ»Ρ‚Π΅Ρ‚ ΠΈ сè ΡƒΡˆΡ‚Π΅ Π³ΠΎ користам Π·Π° ΠΌΠΎΠΈΡ‚Π΅ C++ ΠΈ Python ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ бидСјќи ΠΈΠΌΠ° Π΄ΠΎΠ±Ρ€Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° Ρ‚ΠΈΠ΅ Ρ˜Π°Π·ΠΈΡ†ΠΈ.

Но, ΠΊΠΎΠ³Π° ΠΏΠΎΡ‡Π½Π°Π² Π΄Π° ΡƒΡ‡Π°ΠΌ ΠΈ Π΄Π° Π³ΠΎ користам Go, сС заинтСрСсирав Π΄Π°Π»ΠΈ OpenCV ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со овој јазик. Π’ΠΎ Ρ‚ΠΎΠ° Π²Ρ€Π΅ΠΌΠ΅ вСќС имашС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΈ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΡ˜Π°Π»ΠΈ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°, Π½ΠΎ ΠΌΠΈ сС Ρ‡ΠΈΠ½Π΅ΡˆΠ΅ Π΄Π΅ΠΊΠ° сС ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ ΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ. ΠœΠ°Π»ΠΊΡƒ ΠΏΠΎΠ΄ΠΎΡ†Π½Π°, Π½Π°ΠΈΠ΄ΠΎΠ² Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° создадСна ΠΎΠ΄ Ρ‚ΠΈΠΌΠΎΡ‚ Π½Π° The Hybrid Group. Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, ќС Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со GoCV со Ρ€Π°Π·Π²ΠΈΠ²Π°ΡšΠ΅ Π½Π° СдноставСн систСм Π·Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ Π»ΠΈΡ†Π΅ со Haar Cascades.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅Π½ курс β€žΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ Π½Π° Python ΠΎΠ΄ Π½ΡƒΠ»Π°β€œ.

ΠŸΠΎΡ‚ΡΠ΅Ρ‚ΡƒΠ²Π°ΠΌΠ΅: Π·Π° ситС Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° β€žΠ₯Π°Π±Ρ€β€œ - попуст ΠΎΠ΄ 10 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° кој Π±ΠΈΠ»ΠΎ курс Skillbox ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€ΠΎΠΌΠΎΡ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ β€žΠ₯Π°Π±Ρ€β€œ.

Π¨Ρ‚ΠΎ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ:

  • Оди;
  • 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)
ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†.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 Cascades.

ΠšΠ°ΡΠΊΠ°Π΄ΠΈΡ‚Π΅ Π½Π° Π₯Π°Π°Ρ€ сС каскадни класификатори ΠΊΠΎΠΈ сС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈ со помош Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°Ρ‚Π° Π½Π° Π±Ρ€Π°Π½ΠΎΠ²ΠΈΠ΄Π½ΠΈ Π₯Π°Π°Ρ€ΠΎΠ²ΠΈ. Π’ΠΈΠ΅ Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π°Ρ‚ пиксСлитС Π½Π° сликата Π·Π° Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΡ˜Π°Ρ‚ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ карактСристики. Π—Π° Π΄Π° Π΄ΠΎΠ·Π½Π°Π΅Ρ‚Π΅ повСќС Π·Π° Haar Cascades, Π²Π΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ слСдСтС Π³ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ»Ρƒ.

Π Π°ΠΌΠΊΠ° Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ Π½Π° Π’ΠΈΠΎΠ»Π°-Џонс
Каскадни класификатори
ΠšΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΡΡ‚ΠΈΠΊΠ° слична Π½Π° Π₯Π°Π°Ρ€

ΠŸΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ вСќС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈ каскади ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Ρ‚ΡƒΠΊΠ°. Π’ΠΎ ΡΠ΅Π³Π°ΡˆΠ½ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, каскадитС ќС сС користат Π·Π° Π΄Π° сС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π° Π»ΠΈΡ†Π΅Ρ‚ΠΎ Π½Π° Π»ΠΈΡ†Π΅Ρ‚ΠΎ ΠΎΠ΄ Π½Π°ΠΏΡ€Π΅Π΄.

Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ класификатор ΠΈ Π΄Π° Π³ΠΎ Π½Π°Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ со вСќС ΠΎΠ±ΡƒΡ‡Π΅Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° (врската Π΅ Π΄Π°Π΄Π΅Π½Π° ΠΏΠΎΠ³ΠΎΡ€Π΅). Π’Π΅ΡœΠ΅ ја ΠΏΠΎΠ΄ΠΈΠ³Π½Π°Π² Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° 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 ΡˆΡ‚ΠΎ бСшС Π²Ρ€Π°Ρ‚Π΅Π½ со ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€