āĻ—ā§‹āϞāĻ‚ āĻāĻŦāĻ‚ āĻ“āĻĒ⧇āύāϏāĻŋāĻ­āĻŋāϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻŽā§āĻ– āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

āĻ—ā§‹āϞāĻ‚ āĻāĻŦāĻ‚ āĻ“āĻĒ⧇āύāϏāĻŋāĻ­āĻŋāϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻŽā§āĻ– āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāĻž
OpenCV āĻšāϞ āĻāĻ•āϟāĻŋ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āϝāĻž āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āĻ­āĻŋāĻļāύ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϤāĻŋāύāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻĒā§āϰāĻžāϝāĻŧ 20 āĻŦāĻ›āϰ āĻŦāϝāĻŧāϏ⧀. āφāĻŽāĻŋ āĻāϟāĻŋ āĻ•āϞ⧇āĻœā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻāĻ–āύāĻ“ āĻāϟāĻŋ āφāĻŽāĻžāϰ C++ āĻāĻŦāĻ‚ āĻĒāĻžāχāĻĨāύ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ āĻ•āĻžāϰāĻŖ āĻāϟāĻŋ āϏ⧇āχ āĻ­āĻžāώāĻžāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ­āĻžāϞ āϏāĻŽāĻ°ā§āĻĨāύ āϰāϝāĻŧ⧇āϛ⧇āĨ¤

āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝāĻ–āύ āφāĻŽāĻŋ āĻļ⧇āĻ–āĻž āĻāĻŦāĻ‚ Go āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻļ⧁āϰ⧁ āĻ•āϰāĻŋ, āϤāĻ–āύ āφāĻŽāĻŋ āĻāχ āĻ­āĻžāώāĻžāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ OpenCV āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻ•āĻŋāύāĻž āϤāĻž āύāĻŋāϝāĻŧ⧇ āφāĻ—ā§āϰāĻšā§€ āĻšāϝāĻŧ⧇ āωāĻ āĻŋāĨ¤ āϏ⧇āχ āϏāĻŽāϝāĻŧ⧇, āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻāϕ⧀āĻ•āϰāϪ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻāĻŦāĻ‚ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ āĻ›āĻŋāϞ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻžāϰ āĻ•āĻžāϛ⧇ āĻŽāύ⧇ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āϝ⧇ āϏ⧇āϗ⧁āϞāĻŋ āϖ⧁āĻŦ āϜāϟāĻŋāϞ āĻ›āĻŋāϞāĨ¤ āĻāĻ•āϟ⧁ āĻĒāϰ⧇, āφāĻŽāĻŋ āĻšāĻžāχāĻŦā§āϰāĻŋāĻĄ āĻ—ā§āϰ⧁āĻĒ āϟāĻŋāĻŽā§‡āϰ āϤ⧈āϰāĻŋ āĻāĻ•āϟāĻŋ āĻŽā§‹āĻĄāĻŧāĻ• āĻĻ⧇āĻ–āϤ⧇ āĻĒ⧇āϞāĻžāĻŽāĨ¤ āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āφāĻŽāĻŋ āφāĻĒāύāĻžāϕ⧇ āĻĻ⧇āĻ–āĻžāĻŦ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ GoCV-āĻāϰ āϏāĻžāĻĨ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϝāĻžāϝāĻŧ Haar Cascades-āĻāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŽā§āĻ– āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

Skillbox āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āϕ⧋āĻ°ā§āϏ "āĻļ⧁āϰ⧁ āĻĨ⧇āϕ⧇ āĻĒāĻžāχāĻĨāύ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀".

āφāĻŽāϰāĻž āĻŽāύ⧇ āĻ•āϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāĻšā§āĻ›āĻŋ: "Habr"-āĻāϰ āϏāĻ•āϞ āĻĒāĻžāĻ āĻ•āĻĻ⧇āϰ āϜāĻ¨ā§āϝ - "Habr" āĻĒā§āϰāϚāĻžāϰāĻŽā§‚āϞāĻ• āϕ⧋āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϝ⧇āϕ⧋āύ⧋ Skillbox āϕ⧋āĻ°ā§āϏ⧇ āύāĻĨāĻŋāϭ⧁āĻ•ā§āϤ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ 10 āϰ⧁āĻŦ⧇āϞ āĻ›āĻžāĻĄāĻŧāĨ¤

āĻ•āĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ:

  • āϝāĻžāĻ“āϝāĻŧāĻž;
  • OpenCV (āύāĻŋāĻšā§‡ āχāύāĻ¸ā§āϟāϞāĻžāϰ āϞāĻŋāĻ™ā§āĻ•);
  • āĻ“āϝāĻŧ⧇āĻŦ āĻŦāĻž āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāĨ¤

āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ 1

āĻĒā§āϰāĻĨāĻŽ āωāĻĻāĻžāĻšāϰāϪ⧇, āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ āϝāĻž āĻāĻ•āϟāĻŋ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻāĻ•āϟāĻŋ āωāχāĻ¨ā§āĻĄā§‹ āĻ–ā§‹āϞ⧇āĨ¤

āĻĒā§āϰāĻĨāĻŽā§‡ āφāĻĒāύāĻžāϕ⧇ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϗ⧁āϞāĻŋ āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āφāĻŽāĻĻāĻžāύāĻŋ (
"āϞāĻ—"
"gocv.io/x/gocv"
)

āĻāϰ āĻĒāϰ⧇, āφāĻĒāύāĻžāϕ⧇ VideoCaptureDevice āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ VideoCapture āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻĒāϰ⧇āϰāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤ āĻĢāĻžāĻ‚āĻļāύ āĻāĻ•āϟāĻŋ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻĒā§‚āĻ°ā§āĻŖāϏāĻ‚āĻ–ā§āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ (āĻāϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āφāχāĻĄāĻŋ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāĻ¤ā§āĻŦ āĻ•āϰ⧇)āĨ¤

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()

āĻāĻ–āύ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ āĻ…āĻ‚āĻļ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻ•āĨ¤

āϝ⧇āĻšā§‡āϤ⧁ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻšāϞ āχāĻŽā§‡āϜ āĻĢā§āϰ⧇āĻŽā§‡āϰ āĻāĻ•āϟāĻŋ āĻ•ā§āϰāĻŽāĻžāĻ—āϤ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ, āϤāĻžāχ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ¸ā§āĻŸā§āϰ⧀āĻŽ āĻ…āĻŦāĻŋāϰāĻžāĻŽ āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻ…āϏ⧀āĻŽ āϞ⧁āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāϟāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻžāϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āϟāĻžāχāĻĒ⧇āϰ āϰāĻŋāĻĄ āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻŽā§āϝāĻžāϟ āϟāĻžāχāĻĒ (āφāĻŽāϰāĻž āωāĻĒāϰ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻŽā§āϝāĻžāĻŸā§āϰāĻŋāĻ•ā§āϏ) āφāĻļāĻž āĻ•āϰāĻŦ⧇, āĻ­āĻŋāĻĄāĻŋāĻ“āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āĻĨ⧇āϕ⧇ āĻĢā§āϰ⧇āĻŽāϟāĻŋ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻ•āĻŋāύāĻž āϤāĻž āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻŦ⧁āϞāĻŋāϝāĻŧāĻžāύ āĻŽāĻžāύ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻŦ⧇āĨ¤

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()

āĻāĻ•āϟāĻŋ āĻ›āĻŦāĻŋāϤ⧇ āĻŽā§āĻ– āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻĒāĻĻā§āϧāϤāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻŽāĻžāĻ˛ā§āϟāĻŋāĻ¸ā§āϕ⧇āϞ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧁āύ. āĻāχ āĻĢāĻžāĻ‚āĻļāύāϟāĻŋ āĻāĻ•āϟāĻŋ āĻĢā§āϰ⧇āĻŽ (āϟāĻžāχāĻĒ āĻŽā§āϝāĻžāϟ) āύ⧇āϝāĻŧ āϝāĻž āĻāχāĻŽāĻžāĻ¤ā§āϰ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ¸ā§āĻŸā§āϰ⧀āĻŽ āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰ āϟāĻžāχāĻĒ⧇āϰ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāϰ⧇ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇⧎ āĻ…ā§āϝāĻžāϰ⧇āϰ āφāĻ•āĻžāϰāϟāĻŋ āĻŽā§āϖ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāĻ¤ā§āĻŦ āĻ•āϰ⧇ āϝāĻž āĻ•ā§āϞāĻžāϏāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻĢā§āϰ⧇āĻŽā§‡ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āϤāĻžāϰāĻĒāϰ, āφāĻŽāϰāĻž āĻāϟāĻŋ āĻ•āĻŋ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϝāĻŧ⧇āĻ›āĻŋ āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇, āφāϏ⧁āύ āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞāĻŋāϰ āϤāĻžāϞāĻŋāĻ•āĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻ•āύāϏ⧋āϞ⧇ āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰ āĻŦāĻ¸ā§āϤ⧁āϟāĻŋ āĻŽā§āĻĻā§āϰāĻŖ āĻ•āϰāĻŋ, āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āϰ āϚāĻžāϰāĻĒāĻžāĻļ⧇ āĻāĻ•āϟāĻŋ āϏ⧀āĻŽāĻžāύāĻž āϤ⧈āϰāĻŋ āĻ•āϰāĻŋāĨ¤ āĻāϟāĻŋ āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰ āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāϟāĻŋ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻĄāĻŧāĻž āĻŽā§āϝāĻžāϟ, āĻĄāĻŋāĻŸā§‡āĻ•ā§āϟ āĻŽāĻžāĻ˛ā§āϟāĻŋāĻ¸ā§āϕ⧇āϞ āĻĒāĻĻā§āϧāϤāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻĢāĻŋāϰ⧇ āφāϏāĻž āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰ āĻŦāĻ¸ā§āϤ⧁, āϏ⧀āĻŽāĻžāύāĻžāϰ āϰāĻ™ āĻāĻŦāĻ‚ āĻŦ⧇āϧ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻŦ⧇āĨ¤

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 āĻ“āϝāĻŧ⧇āĻŦ āϏāĻžāĻ°ā§āĻ­āĻžāϰ, āϝāĻž āφāĻŽāĻŋ āĻĒāĻžāχāĻĨāύ āĻāĻŦāĻ‚ āĻ“āĻĒ⧇āύāϏāĻŋāĻ­āĻŋāϤ⧇ āϞāĻŋāϖ⧇āĻ›āĻŋāĨ¤ āĻŽā§āĻ– āĻļāύāĻžāĻ•ā§āϤ āĻšāĻ“āϝāĻŧāĻžāϰ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āĻāϟāĻŋ āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāώāĻžāϝāĻŧ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϤ⧈āϰāĻŋāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋāĨ¤ āϤāĻžāϰāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦ⧇āĨ¤

āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋ āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻ!

Skillbox āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇:

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster