เบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบšเบปเบšเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เปƒเบšเบซเบ™เป‰เบฒเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ Golang เปเบฅเบฐ OpenCV

เบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบšเบปเบšเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เปƒเบšเบซเบ™เป‰เบฒเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ Golang เปเบฅเบฐ OpenCV
OpenCV เป€เบ›เบฑเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบงเบดเป„เบชเบ—เบฑเบ”เบ„เบญเบกเบžเบดเบงเป€เบ•เบต. เบ™เบฒเบ‡เบกเบตเบญเบฒเบเบธเบ›เบฐเบกเบฒเบ™ 20 เบ›เบตเปเบฅเป‰เบง. เบ‚เป‰เบญเบเปƒเบŠเป‰เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบงเบดเบ—เบฐเบเบฒเป„เบฅเปเบฅเบฐเบเบฑเบ‡เปƒเบŠเป‰เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ C ++ เปเบฅเบฐ Python เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ—เบตเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™.

เปเบ•เปˆเป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบฎเบฝเบ™เปเบฅเบฐเปƒเบŠเป‰ Go, เบ‚เป‰เบญเบเบชเบปเบ‡เป„เบชเบงเปˆเบฒ OpenCV เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบฒเบชเบฒเบ™เบตเป‰. เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ™เบฑเป‰เบ™โ€‹เบกเบตโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เปเบฅเบฐ tutorials เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เป‚เบเบ‡โ€‹เปเบฅเป‰เบง, เปเบ•เปˆโ€‹เป€เบšเบดเปˆเบ‡โ€‹เบ„เบทโ€‹เบงเปˆเบฒโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบชเบฑเบšโ€‹เบชเบปเบ™โ€‹เป€เบเบตเบ™โ€‹เป„เบ›. เปœเป‰เบญเบเปœเบถเปˆเบ‡, เบ‚เป‰เบญเบเป„เบ”เป‰เบžเบปเบšเป€เบ„เบทเปˆเบญเบ‡เบซเปเปˆเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบเบธเปˆเบกเบฅเบนเบเบ›เบฐเบชเบปเบก. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฑเบš GoCV เป‚เบ”เบเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบฅเบฐเบšเบปเบšเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เปƒเบšเบซเบ™เป‰เบฒเปเบšเบšเบ‡เปˆเบฒเบเป†เบเบฑเบš Haar Cascades.

Skillbox เปเบ™เบฐเบ™เปเบฒ: เบซเบผเบฑเบเบชเบนเบ”เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ” "เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Python เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™".

เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™: เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "Habr" - เบชเปˆเบงเบ™เบซเบผเบธเบ” 10 rubles เป€เบกเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบซเบผเบฑเบเบชเบนเบ” Skillbox เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบก "Habr".

เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™:

  • เป„เบ›;
  • OpenCV (เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป„เบ›เบซเบฒเบ•เบปเบงเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰);
  • web เบซเบผเบทเบเป‰เบญเบ‡เบ–เปˆเบฒเบเบงเบดเบ”เบตเป‚เบญเบ›เบปเบเบเบฐเบ•เบด.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ

เบ•เบปเบงเบขเปˆเบฒเบ‡ 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()

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡ matrix n-dimensional. เบกเบฑเบ™เบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบญเปˆเบฒเบ™เบˆเบฒเบเบเป‰เบญเบ‡เบ–เปˆเบฒเบเบฎเบนเบš.

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

เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เบ™เป‰เปเบฒเบงเบดเบ”เบตเป‚เบญ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก - เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ NewWindow.

window := gocv.NewWindow(โ€œwebcamwindowโ€)
defer window.Close()

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบชเปˆเบงเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบชเบธเบ”.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเบดเบ”เบตเป‚เบญเป€เบ›เบฑเบ™เป€เบŸเบฃเบกเบฎเบนเบšเบžเบฒเบšเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบงเบปเบ‡เปเบซเบงเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”เป€เบžเบทเปˆเบญเบญเปˆเบฒเบ™เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบงเบดเบ”เบตเป‚เบญเบ‚เบญเบ‡เบเป‰เบญเบ‡เบ–เปˆเบฒเบเบฎเบนเบšเบขเปˆเบฒเบ‡เบšเปเปˆเบขเบธเบ”เบขเบฑเป‰เบ‡. เบ™เบตเป‰เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบญเปˆเบฒเบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” VideoCapture. เบกเบฑเบ™เบˆเบฐเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบ›เบฐเป€เบžเบ” Mat (เบกเบฒเบ•เบฃเบดเบเป€เบšเบทเป‰เบญเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡), เบชเบปเปˆเบ‡เบ„เบทเบ™ boolean เบŠเบตเป‰เบšเบญเบเบงเปˆเบฒเบเบญเบšเบˆเบฒเบ 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

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 เปเบกเปˆเบ™เบ•เบปเบงเบˆเบฑเบ”เบ›เบฐเป€เบžเบ” cascaded เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบถเบเบญเบปเบšเบฎเบปเบกเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเป€เบ•เบฑเบเบ™เบดเบเบเบฒเบ™เบ„เบทเป‰เบ™ Haar. เบžเบงเบเป€เบ‚เบปเบฒเบงเบดเป€เบ„เบฒเบฐ pixels เปƒเบ™เบฎเบนเบšเบžเบฒเบšเป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเป€เบžเบฒเบฐ. เป€เบžเบทเปˆเบญเบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš Haar Cascades, เบเบฐเบฅเบธเบ™เบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เบเบญเบšเบเบฒเบ™เบŠเบญเบเบ„เบปเป‰เบ™เบซเบฒเบงเบฑเบ”เบ–เบธ Viola-Jones
เบเบฒเบ™เบˆเบฑเบ”เบ›เบฐเป€เบžเบ” Cascading
เบฅเบฑเบเบชเบฐเบ™เบฐเบ„เป‰เบฒเบเบ„เบท Haar

เบ”เบฒเบงเป‚เบซเบฅเบ” cascades เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบถเบเบญเบปเบšเบฎเบปเบกเปเบฅเป‰เบง เบชเบฒเบกเบฒเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ›เบฐเบˆเบธเบšเบฑเบ™, cascades เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เปƒเบšเบซเบ™เป‰เบฒเบ‚เบญเบ‡เบšเบธเบเบ„เบปเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡เบขเบนเปˆเบ—เบฒเบ‡เบซเบ™เป‰เบฒ.

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ•เบปเบงเบˆเบฑเบ”เบ›เบฐเป€เบžเบ”เปเบฅเบฐเปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบŸเบฅเปŒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบถเบเบญเบปเบšเบฎเบปเบกเปเบฅเป‰เบง (เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบกเปˆเบ™เปƒเบซเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡). เบ‚เป‰เบญเบเป„เบ”เป‰เบญเบฑเบšเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ pencv_haarcascade_frontalface_default.xml เป„เบ›เบ—เบตเปˆเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบšเปˆเบญเบ™เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบขเบนเปˆ.

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

เป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเปƒเบšเบซเบ™เป‰เบฒเปƒเบ™เบฎเบนเบšเบžเบฒเบš, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ DetectMultiScale. เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเบเบญเบš (เบ›เบฐเป€เบžเบ” Mat) เบ—เบตเปˆเบซเบฒเบเปเปˆเบญเปˆเบฒเบ™เบˆเบฒเบเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบงเบดเบ”เบตเป‚เบญเบ‚เบญเบ‡เบเป‰เบญเบ‡เบ–เปˆเบฒเบเบฎเบนเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™ array เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” Rectangle. เบ‚เบฐเปœเบฒเบ”เบ‚เบญเบ‡เบญเบฒเป€เบฃเบชเบฐเปเบ”เบ‡เป€เบ–เบดเบ‡เบˆเบณเบ™เบงเบ™เปœเป‰เบฒเบ—เบตเปˆเบ•เบปเบงเบˆเบฑเบ”เบ›เบฐเป€เบžเบ”เบชเบฒเบกเบฒเบ”เบเบงเบ”เบžเบปเบšเปƒเบ™เบเบญเบš. เบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เบžเบปเบš, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเป‚เบ”เบเบœเปˆเบฒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบตเปˆเบซเบฅเปˆเบฝเบกเปเบฅเบฐเบžเบดเบกเบงเบฑเบ”เบ–เบธเบชเบตเปˆเบซเบฅเปˆเบฝเบกเปƒเบชเปˆเบ„เบญเบ™เป‚เบŠเบ™, เบชเป‰เบฒเบ‡เบ‚เบญเบšเบฎเบญเบšเบชเบตเปˆเบซเบฅเปˆเบฝเบกเบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบชเบตเปˆเบซเบฅเปˆเบฝเบก. เบกเบฑเบ™เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒ Mat เบญเปˆเบฒเบ™เป‚เบ”เบเบเป‰เบญเบ‡เบ–เปˆเบฒเบเบฎเบนเบš, เบงเบฑเบ”เบ–เบธเบชเบตเปˆเบซเบฅเปˆเบฝเบกเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบเบงเบดเบ—เบตเบเบฒเบ™ 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™