เจ—เฉ‹เจฒเฉฐเจ— เจ…เจคเฉ‡ เจ“เจชเจจเจธเฉ€เจตเฉ€ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจšเจฟเจนเจฐเจพ เจชเจ›เจพเจฃ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฌเจฃเจพเจ‰เจฃเจพ

เจ—เฉ‹เจฒเฉฐเจ— เจ…เจคเฉ‡ เจ“เจชเจจเจธเฉ€เจตเฉ€ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจšเจฟเจนเจฐเจพ เจชเจ›เจพเจฃ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฌเจฃเจพเจ‰เจฃเจพ
OpenCV เจ‡เฉฑเจ• เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจนเฉˆ เจœเฉ‹ เจ•เฉฐเจชเจฟเจŠเจŸเจฐ เจตเจฟเจœเจผเจจ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค เจ‰เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฒเจ—เจญเจ— 20 เจธเจพเจฒเจพเจ‚ เจฆเฉ€ เจนเฉˆเฅค เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจพเจฒเจœ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจ…เจคเฉ‡ เจ…เจœเฉ‡ เจตเฉ€ เจ‡เจธเจจเฉ‚เฉฐ เจฎเฉ‡เจฐเฉ‡ C++ เจ…เจคเฉ‡ เจชเจพเจˆเจฅเจจ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจตเจฐเจคเจฆเจพ เจนเจพเจ‚ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจธ เจตเจฟเฉฑเจš เจ‰เจนเจจเจพเจ‚ เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฒเจˆ เจšเฉฐเจ—เจพ เจธเจฎเจฐเจฅเจจ เจนเฉˆเฅค

เจชเจฐ เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจ—เฉ‹ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจ–เจฃเจพ เจ…เจคเฉ‡ เจตเจฐเจคเจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ, เจคเจพเจ‚ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ เจ—เฉฑเจฒ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจนเฉ‹ เจ—เจˆ เจ•เจฟ เจ•เฉ€ OpenCV เจจเฉ‚เฉฐ เจ‡เจธ เจญเจพเจธเจผเจพ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‰เจธ เจธเจฎเฉ‡เจ‚, เจเจ•เฉ€เจ•เจฐเจฃ 'เจคเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจ…เจคเฉ‡ เจŸเจฟเจŠเจŸเฉ‹เจฐเจฟเจ…เจฒ เจธเจจ, เจชเจฐ เจ‡เจน เจฎเฉˆเจจเฉ‚เฉฐ เจœเจพเจชเจฆเจพ เจธเฉ€ เจ•เจฟ เจ‰เจน เจฌเจนเฉเจค เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจธเจจเฅค เจฅเฉ‹เฉœเฉ€ เจฆเฉ‡เจฐ เจฌเจพเจ…เจฆ, เจฎเฉˆเจจเฉ‚เฉฐ เจนเจพเจˆเจฌเฉเจฐเจฟเจก เจ—เจฐเฉเฉฑเจช เจŸเฉ€เจฎ เจฆเฉเจ†เจฐเจพ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจ‡เฉฑเจ• เจฐเฉˆเจชเจฐ เจฎเจฟเจฒเจฟเจ†เฅค เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เจพ เจ•เจฟ เจนเจพเจฐ เจ•เฉˆเจธเจ•เฉ‡เจกเจœเจผ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจšเจฟเจนเจฐเจพ เจชเจ›เจพเจฃ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐเจ•เฉ‡ 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()

เจ‡เฉฑเจ• เจตเฉ€เจกเฉ€เจ“ เจธเจŸเฉเจฐเฉ€เจฎ เจจเฉ‚เฉฐ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจฟเฉฐเจกเฉ‹ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ - เจ‡เจน NewWindow เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

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
     }
.
.
.
}

เจนเฉเจฃ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเจฃเจพเจˆ เจตเจฟเฉฐเจกเฉ‹ เจตเจฟเฉฑเจš เจซเจฐเฉ‡เจฎ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เจ—เจฒเฉ‡ เจซเจฐเฉ‡เจฎ 'เจคเฉ‡ เจœเจพเจฃ เจฒเจˆ เจตเจฟเจฐเจพเจฎ 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

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจ†เจ“ เจชเจฟเจ›เจฒเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจนเจพเจฐ เจ•เฉˆเจธเจ•เฉ‡เจกเจœเจผ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจšเจฟเจนเจฐเจพ เจชเจ›เจพเจฃ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฌเจฃเจพเจˆเจเฅค

เจนเจพเจฐ เจ•เฉˆเจธเจ•เฉ‡เจก เจ•เฉˆเจธเจ•เฉ‡เจก เจตเจฐเจ—เฉ€เจ•เจฐเจฃ เจนเจจ เจœเฉ‹ เจนเจพเจฐ เจตเฉ‡เจตเจฒเฉ‡เจŸ เจคเจ•เจจเฉ€เจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจฟเจ–เจฒเจพเจˆ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจ‰เจน เจ•เฉเจ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจชเจฟเจ•เจธเจฒ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจนเจพเจฐ เจ•เฉˆเจธเจ•เฉ‡เจกเจœเจผ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจœเจพเจฃเจจ เจฒเจˆ, เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจฒเจฟเฉฐเจ•เจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเฉ‹เฅค

เจตเจฟเจ“เจฒเจพ-เจœเฉ‹เจจเจธ เจ†เจฌเจœเฉˆเจ•เจŸ เจ–เฉ‹เจœ เจซเจฐเฉ‡เจฎเจตเจฐเจ•
เจ•เฉˆเจธเจ•เฉ‡เจกเจฟเฉฐเจ— เจตเจฐเจ—เฉ€เจ•เจฐเจฃ
เจนเจพเฉœ เจตเจฐเจ—เฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ

เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจธเจฟเจ–เจฒเจพเจˆ เจชเฉเจฐเจพเจชเจค เจ•เฉˆเจธเจ•เฉ‡เจกเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเฉ‹ เจ‡เฉฑเจฅเฉ‡ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ. เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจธเจพเจนเจฎเจฃเฉ‡ เจคเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจตเจฟเจ…เจ•เจคเฉ€ เจฆเฉ‡ เจšเจฟเจนเจฐเฉ‡ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เจฐเจจ เจฒเจˆ เจ•เฉˆเจธเจ•เฉ‡เจกเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฒเจพเจธเฉ€เจซเจพเจ‡เจฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจนเฉ€ เจธเจฟเจ–เจฒเจพเจˆ เจชเฉเจฐเจพเจชเจค เจซเจพเจˆเจฒ เจซเฉ€เจก เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ (เจฒเจฟเฉฐเจ• เจ‰เฉฑเจชเจฐ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ)เฅค เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ 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 เจ…เจคเฉ‡ OpenCV เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจ•เฉ‡ เจจเจตเฉ€เจ†เจ‚ เจธเจผเจพเจจเจฆเจพเจฐ เจšเฉ€เจœเจผเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ เจฌเจฃเจพ เจฐเจฟเจนเจพ เจนเจพเจ‚เฅค

เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจฐเฉ‡เจŸ เจ•เจฐเฉ‹ gRPC เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ, เจœเฉ‹ เจฎเฉˆเจ‚ เจชเจพเจˆเจฅเจจ เจ…เจคเฉ‡ เจ“เจชเจจเจธเฉ€เจตเฉ€ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจนเฉˆเฅค เจšเจฟเจนเจฐเฉ‡ เจฆเจพ เจชเจคเจพ เจฒเฉฑเจ—เจฃ 'เจคเฉ‡ เจ‡เจน เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจตเฉฑเจ–-เจตเฉฑเจ– เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– เจ•เจฒเจพเจ‡เฉฐเจŸเจธ เจฌเจฃเจพเจ‰เจฃ เจฆเจพ เจ†เจงเจพเจฐ เจนเฉˆเฅค เจ‰เจน เจธเจฐเจตเจฐ เจจเจพเจฒ เจœเฉเฉœ เจธเจ•เจฃเจ—เฉ‡ เจ…เจคเฉ‡ เจ‡เจธ เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจชเฉœเฉเจน เจธเจ•เจฃเจ—เฉ‡เฅค

เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจฒเจˆ เจคเฉเจนเจพเจกเจพ เจงเฉฐเจจเจตเจพเจฆ!

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹