เช—เซ‹เชฒเชพเช‚เช— เช…เชจเซ‡ เช“เชชเชจเชธเซ€เชตเซ€ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซ‡เชธ เชฐเซ‡เช•เช—เซเชจเชฟเชถเชจ เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเชตเซ€

เช—เซ‹เชฒเชพเช‚เช— เช…เชจเซ‡ เช“เชชเชจเชธเซ€เชตเซ€ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซ‡เชธ เชฐเซ‡เช•เช—เซเชจเชฟเชถเชจ เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเชตเซ€
OpenCV เช เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชตเชฟเชเชจ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชฐเชšเชพเชฏเซ‡เชฒ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เช›เซ‡. เชคเซ‡เชฃเซ€ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฒเช—เชญเช— 20 เชตเชฐเซเชทเชจเซ€ เช›เซ‡. เชฎเซ‡เช‚ เชคเซ‡เชจเซ‹ เช•เซ‹เชฒเซ‡เชœเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹ เช…เชจเซ‡ เชนเชœเซ เชชเชฃ เชฎเชพเชฐเชพ C++ เช…เชจเซ‡ Python เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เชฎเชพเช‚ เชคเซ‡ เชญเชพเชทเชพเช“ เชฎเชพเชŸเซ‡ เชธเชพเชฐเซ‹ เชธเชชเซ‹เชฐเซเชŸ เช›เซ‡.

เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ Go เชถเซ€เช–เชตเชพเชจเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เชคเซเชฏเชพเชฐเซ‡ เชฎเชจเซ‡ เช† เชญเชพเชทเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ OpenCV เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡เชฎเชพเช‚ เชฐเชธ เชชเชกเซเชฏเซ‹. เชคเซ‡ เชธเชฎเชฏเซ‡, เชเช•เซ€เช•เชฐเชฃ เชชเชฐ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช…เชจเซ‡ เชŸเซเชฏเซเชŸเซ‹เชฐเชฟเชฏเชฒเซเชธ เชนเชคเชพ, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฎเชจเซ‡ เชฒเชพเช—เชคเซเช‚ เชนเชคเซเช‚ เช•เซ‡ เชคเซ‡ เช–เซ‚เชฌ เชœเชŸเชฟเชฒ เชนเชคเชพ. เชฅเซ‹เชกเซ€ เชตเชพเชฐ เชชเช›เซ€, เชนเซเช‚ เชง เชนเชพเช‡เชฌเซเชฐเชฟเชก เช—เซเชฐเซเชช เชŸเซ€เชฎ เชฆเซเชตเชพเชฐเชพ เชฌเชจเชพเชตเซ‡เชฒ เชฐเซ‡เชชเชฐ เชธเชพเชฎเซ‡ เช†เชตเซเชฏเซ‹. เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเซ€เชถ เช•เซ‡ Haar Cascades เชธเชพเชฅเซ‡ เชเช• เชธเชฐเชณ เชšเชนเซ‡เชฐเซ‹ เช“เชณเช–เชตเชพเชจเซ€ เชธเชฟเชธเซเชŸเชฎ เชตเชฟเช•เชธเชพเชตเซ€เชจเซ‡ GoCV เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชถเชฐเซ‚เช†เชค เช•เชฐเชตเซ€.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡: เชชเซเชฐเซ‡เช•เซเชŸเชฟเช•เชฒ เช•เซ‹เชฐเซเชธ "เชถเชฐเซ‚เช†เชคเชฅเซ€ เชชเชพเชฏเชฅเซ‹เชจ เชกเซ‡เชตเชฒเชชเชฐ".

เช…เชฎเซ‡ เชฏเชพเชฆ เช•เชฐเชพเชตเซ€เช เช›เซ€เช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ - Habr เชชเซเชฐเซ‹เชฎเซ‹ เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เช•เซ‹เชฐเซเชธเชฎเชพเช‚ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ 10 เชฐเซ‚เชฌเชฒ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ.

เชถเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡:

  • เชœเชพเช“;
  • OpenCV (เชจเซ€เชšเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ เชฒเชฟเช‚เช•เซเชธ);
  • เชตเซ‡เชฌ เช…เชฅเชตเชพ เชจเชฟเชฏเชฎเชฟเชค เชตเชฟเชกเชฟเชฏเซ‹ เช•เซ‡เชฎเซ‡เชฐเชพ.

เชธเซเชฅเชพเชชเชจ

เช‰เชฆเชพเชนเชฐเชฃ 1

เชชเซเชฐเชฅเชฎ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เช…เชฎเซ‡ เชเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถเซเช‚ เชœเซ‡ เช•เซ‡เชฎเซ‡เชฐเชพ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชฆเชฐเซเชถเชพเชตเชคเซ€ เชตเชฟเช‚เชกเซ‹ เช–เซ‹เชฒเซ‡ เช›เซ‡.

เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ เช•เชพเชฎ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เช†เชฏเชพเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เช†เชฏเชพเชค (
"เชฒเซ‹เช—"
"gocv.io/x/gocv"
)

เช† เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ VideoCaptureDevice เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ VideoCapture เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฌเชพเชฆเชฎเชพเช‚ เช•เซ‡เชฎเซ‡เชฐเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เช•เซ‡เชชเซเชšเชฐ เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชซเช‚เช•เซเชถเชจ เชชเชฐเชฟเชฎเชพเชฃ เชคเชฐเซ€เช•เซ‡ เชชเซ‚เชฐเซเชฃเชพเช‚เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ (เชคเซ‡ เช‰เชชเช•เชฐเชฃ 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()

เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชตเชฟเชจเซเชกเซ‹ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ - เช† เชจเซเชฏเซ‚เชตเชฟเชจเซเชกเซ‹ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

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

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชธเซŒเชฅเซ€ เชฐเชธเชชเซเชฐเชฆ เชญเชพเช— เชคเชฐเชซ เช†เช—เชณ เชตเชงเซ€เช.

เชตเชฟเชกเชฟเชฏเซ‹ เช เช‡เชฎเซ‡เชœ เชซเซเชฐเซ‡เชฎเซเชธเชจเซ‹ เชธเชคเชค เชชเซเชฐเชตเชพเชน เชนเซ‹เชตเชพเชฅเซ€, เช•เซ‡เชฎเซ‡เชฐเชพเชจเชพ เชตเชฟเชกเชฟเชฏเซ‹ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เช…เชตเชฟเชฐเชคเชชเชฃเซ‡ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซ‡ เช…เชจเช‚เชค เชฒเซ‚เชช เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชตเชฟเชกเซ€เชฏเซ‹เช•เซ‡เชชเซเชšเชฐ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชฐเซ€เชก เชชเชฆเซเชงเชคเชฟเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡ เชฎเซ‡เชŸ เชชเซเชฐเช•เชพเชฐ (เช…เชฎเซ‡ เช‰เชชเชฐ เชฌเชจเชพเชตเซ‡เชฒ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ) เชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เชถเซ‡, เชฌเซเชฒเชฟเชฏเชจ เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเชถเซ‡ เชœเซ‡ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชถเซเช‚ 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)

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเซ‹เช‚เชš เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช•เซ‡เชฎเซ‡เชฐเชพเชฎเชพเช‚เชฅเซ€ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชธเชพเชฅเซ‡เชจเซ€ เชเช• เชตเชฟเช‚เชกเซ‹ เช–เซเชฒเชถเซ‡.

เช—เซ‹เชฒเชพเช‚เช— เช…เชจเซ‡ เช“เชชเชจเชธเซ€เชตเซ€ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซ‡เชธ เชฐเซ‡เช•เช—เซเชจเชฟเชถเชจ เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเชตเซ€

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 เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซ‡เชธ เชฐเซ‡เช•เช—เซเชจเชฟเชถเชจ เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเซ€เช.

เชนเชพเชฐ เช•เชพเชธเซเช•เซ‡เชก เช เช•เชพเชธเซเช•เซ‡เชก เชตเชฐเซเช—เซ€เช•เซƒเชค เช›เซ‡ เชœเซ‡เชจเซ‡ เชนเชพเชฐ เชตเซ‡เชตเชฒเซ‡เชŸ เชคเช•เชจเซ€เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเชพเชฒเซ€เชฎ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เช“ เช…เชฎเซเช• เชตเชฟเชถเซ‡เชทเชคเชพเช“เชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เช‡เชฎเซ‡เชœเชฎเชพเช‚ เชชเชฟเช•เซเชธเซ‡เชฒเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ‡ เช›เซ‡. เชนเชพเชฐ เช•เชพเชธเซเช•เซ‡เชกเซเชธ เชตเชฟเชถเซ‡ เชตเชงเซ เชœเชพเชฃเชตเชพ เชฎเชพเชŸเซ‡, เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชฒเชฟเช‚เช•เซเชธเชจเซ‡ เช…เชจเซเชธเชฐเซ‹.

เชตเชพเชฏเซ‹เชฒเชพ-เชœเซ‹เชจเซเชธ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชกเชฟเชŸเซ‡เช•เซเชถเชจ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•
เช•เซ‡เชธเซเช•เซ‡เชกเซ€เช‚เช— เชตเชฐเซเช—เซ€เช•เซƒเชค
เชนเชพเชฐ เชœเซ‡เชตเซเช‚ เชฒเช•เซเชทเชฃ

เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซเชฐเชถเชฟเช•เซเชทเชฟเชค เช•เชพเชธเซเช•เซ‡เชก เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹ เช…เชนเซ€เช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชตเชฐเซเชคเชฎเชพเชจ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เช†เช—เชณเชฅเซ€ เชตเซเชฏเช•เซเชคเชฟเชจเชพ เชšเชนเซ‡เชฐเชพเชจเซ‡ เช“เชณเช–เชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชธเซเช•เซ‡เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช•เซเชฒเชพเชธเชฟเชซเชพเชฏเชฐ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซเชฐเชถเชฟเช•เซเชทเชฟเชค เชซเชพเช‡เชฒ เชซเซ€เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เชฒเชฟเช‚เช• เช‰เชชเชฐ เช†เชชเซ‡เชฒเซ€ เช›เซ‡). เชฎเซ‡เช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ pencv_haarcascade_frontalface_default.xml เชซเชพเช‡เชฒ เชœเซเชฏเชพเช‚ เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเซเชฅเชฟเชค เช›เซ‡ เชคเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เช›เซ‡.

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

เช›เชฌเซ€เชฎเชพเช‚ เชšเชนเซ‡เชฐเชพ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ DetectMultiScale. เช† เชซเช‚เช•เซเชถเชจ เชเช• เชซเซเชฐเซ‡เชฎ (เชŸเชพเชˆเชช เชฎเซ‡เชŸ) เชฒเซ‡ เช›เซ‡ เชœเซ‡ เช•เซ‡เชฎเซ‡เชฐเชพเชจเชพ เชตเชฟเชกเชฟเชฏเซ‹ เชธเซเชŸเซเชฐเซ€เชฎเชฎเชพเช‚เชฅเซ€ เชนเชฎเชฃเชพเช‚ เชœ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชฒเช‚เชฌเชšเซ‹เชฐเชธ เชชเซเชฐเช•เชพเชฐเชจเซ‹ เชเชฐเซ‡ เช†เชชเซ‡ เช›เซ‡. เชเชฐเซ‡เชจเซเช‚ เช•เชฆ เช เชšเชนเซ‡เชฐเชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพเชจเซ‡ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชจเซ‡ เชตเชฐเซเช—เซ€เช•เซƒเชคเช•เชฐเซเชคเชพ เชซเซเชฐเซ‡เชฎเชฎเชพเช‚ เชถเซ‹เชงเซ€ เชถเช•เซเชฏเชพ เชนเชคเชพ. เชชเช›เซ€, เชคเซ‡ เชถเซเช‚ เชฎเชณเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชฒเช‚เชฌเชšเซ‹เชฐเชธเชจเซ€ เชธเซ‚เชšเชฟ เชฆเซเชตเชพเชฐเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเซ€เช เช…เชจเซ‡ เชฒเช‚เชฌเชšเซ‹เชฐเชธ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เช•เชจเซเชธเซ‹เชฒ เชชเชฐ เชชเซเชฐเชฟเชจเซเชŸ เช•เชฐเซ€เช, เชถเซ‹เชงเชพเชฏเซ‡เชฒ เชฒเช‚เชฌเชšเซ‹เชฐเชธเชจเซ€ เชซเชฐเชคเซ‡ เชฌเซ‹เชฐเซเชกเชฐ เชฌเชจเชพเชตเซ€เช. เช† เชฒเช‚เชฌเชšเซ‹เชฐเชธ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡ เช•เซ‡เชฎเซ‡เชฐเชพ เชฆเซเชตเชพเชฐเชพ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชฎเซ‡เชŸ, เชกเชฟเชŸเซ‡เช•เซเชŸ เชฎเชฒเซเชŸเซ€เชธเซเช•เซ‡เชฒ เชชเชฆเซเชงเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชฒเช‚เชฌเชšเซ‹เชฐเชธ เช‘เชฌเซเชœเซ‡เช•เซเชŸ, เชฌเซ‹เชฐเซเชกเชฐ เชฎเชพเชŸเซ‡เชจเซ‹ เชฐเช‚เช— เช…เชจเซ‡ เชœเชพเชกเชพเชˆ เชธเซเชตเซ€เช•เชพเชฐเชถเซ‡.

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

เช—เซ‹เชฒเชพเช‚เช— เช…เชจเซ‡ เช“เชชเชจเชธเซ€เชตเซ€ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซ‡เชธ เชฐเซ‡เช•เช—เซเชจเชฟเชถเชจ เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเชตเซ€

เช—เซ‹เชฒเชพเช‚เช— เช…เชจเซ‡ เช“เชชเชจเชธเซ€เชตเซ€ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซ‡เชธ เชฐเซ‡เช•เช—เซเชจเชฟเชถเชจ เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเชตเซ€

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 เชฎเชพเช‚ เชฒเช–เซเชฏเซเช‚ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชšเชนเซ‡เชฐเซ‹ เชถเซ‹เชงเชพเชฏ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชกเซ‡เชŸเชพเชจเซ‡ เชธเซเชŸเซเชฐเซ€เชฎ เช•เชฐเซ‡ เช›เซ‡. เช† เชตเชฟเชตเชฟเชง เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชฎเชพเช‚ เชตเชฟเชตเชฟเชง เช•เซเชฒเชพเชฏเช‚เชŸ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เช†เชงเชพเชฐ เช›เซ‡. เชคเซ‡เช“ เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เชฅเชˆ เชถเช•เชถเซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเซ€ เชถเช•เชถเซ‡.

เชฒเซ‡เช– เชตเชพเช‚เชšเชตเชพ เชฌเชฆเชฒ เช†เชญเชพเชฐ!

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹