рдЧреЛрд▓рдВрдЧ рдЖрдгрд┐ рдУрдкрдирд╕реАрд╡реНрд╣реАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЪреЗрд╣рд░рд╛ рдУрд│рдЦрдгреНрдпрд╛рдЪреА рдкреНрд░рдгрд╛рд▓реА рддрдпрд╛рд░ рдХрд░рдгреЗ

рдЧреЛрд▓рдВрдЧ рдЖрдгрд┐ рдУрдкрдирд╕реАрд╡реНрд╣реАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЪреЗрд╣рд░рд╛ рдУрд│рдЦрдгреНрдпрд╛рдЪреА рдкреНрд░рдгрд╛рд▓реА рддрдпрд╛рд░ рдХрд░рдгреЗ
OpenCV рд╣реА рдПрдХ рд▓рд╛рдпрдмреНрд░рд░реА рдЖрд╣реЗ рдЬреА рд╕рдВрдЧрдгрдХреАрдп рджреГрд╖реНрдЯреА рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реА рдЖрд╣реЗ. рддреА рдЖрдзреАрдЪ рд╕реБрдорд╛рд░реЗ 20 рд╡рд░реНрд╖рд╛рдВрдЪреА рдЖрд╣реЗ. рдореА рддреЗ рдХреЙрд▓реЗрдЬрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗ рдЖрдгрд┐ рддрд░реАрд╣реА рддреЗ рдорд╛рдЭреНрдпрд╛ C++ рдЖрдгрд┐ Python рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╕рд╛рдареА рд╡рд╛рдкрд░рддреЗ рдХрд╛рд░рдг рддреНрдпрд╛ рднрд╛рд╖рд╛рдВрдирд╛ рдЪрд╛рдВрдЧрд▓рд╛ рд╕рдкреЛрд░реНрдЯ рдЖрд╣реЗ.

рдкрдг рдЬреЗрд╡реНрд╣рд╛ рдореА рдЧреЛ рд╢рд┐рдХрд╛рдпрд▓рд╛ рдЖрдгрд┐ рд╡рд╛рдкрд░рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА, рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рдпрд╛ рднрд╛рд╖реЗрд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА OpenCV рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддрд╛ рдпреЗрдИрд▓ рдХрд╛ рдпрд╛рдмрджреНрджрд▓ рд░рд╕ рд╡рд╛рдЯреВ рд▓рд╛рдЧрд▓рд╛. рддреНрдпрд╛ рд╡реЗрд│реА, рдПрдХрд╛рддреНрдорддреЗрд╡рд░ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдгрд┐ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реЛрддреЗ, рдкрд░рдВрддреБ рдорд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдХреА рддреЗ рдЦреВрдк рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗрдд. рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ, рдорд▓рд╛ рд╣рд╛рдпрдмреНрд░реАрдб рдЧреНрд░реБрдк рдЯреАрдордиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рд░реЕрдкрд░ рднреЗрдЯрд▓реЗ. рдпрд╛ рд▓реЗрдЦрд╛рдд, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ Haar Cascades рд╕рд╣ рдПрдХ рд╕рд╛рдзреА рдЪреЗрд╣рд░рд╛ рдУрд│рдЦ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░реВрди GoCV рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд╕рд╛ рдХрд░рд╛рдпрдЪрд╛ рддреЗ рджрд╛рдЦрд╡рдгрд╛рд░ рдЖрд╣реЗ.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕ "рдкрд╛рдпрдерди рд╡рд┐рдХрд╕рдХ рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди".

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 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()

рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХ рд╡рд┐рдВрдбреЛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ - рд╣реЗ NewWindow рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

window := gocv.NewWindow(тАЬwebcamwindowтАЭ)
defer window.Close()

рдЖрддрд╛ рд╕рд░реНрд╡рд╛рдд рдордиреЛрд░рдВрдЬрдХ рднрд╛рдЧрд╛рдХрдбреЗ рдЬрд╛рдКрдпрд╛.

рд╡реНрд╣рд┐рдбрд┐рдУ рд╣рд╛ рдЗрдореЗрдЬ рдлреНрд░реЗрдореНрд╕рдЪрд╛ рдПрдХ рд╕рддрдд рдкреНрд░рд╡рд╛рд╣ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдХреЕрдореЗрд░рд╛рдЪрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рдЕрд╡рд┐рд░рддрдкрдгреЗ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдирдВрдд рд▓реВрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ VideoCapture рдкреНрд░рдХрд╛рд░рд╛рдЪреА Read рдкрджреНрдзрдд рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреЗ рдореЕрдЯ рдкреНрд░рдХрд╛рд░ (рдЖрдореНрд╣реА рд╡рд░ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдореЕрдЯреНрд░рд┐рдХреНрд╕) рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрд╣реЗ, рд╡реНрд╣рд┐рдбрд┐рдУ рдХреЕрдкреНрдЪрд░рдордзреАрд▓ рдлреНрд░реЗрдо рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рд╡рд╛рдЪрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рджрд░реНрд╢рд╡рдгрд╛рд░реЗ рдмреБрд▓рд┐рдпрди рдореВрд▓реНрдп рдкрд░рдд рдХрд░реЗрд▓.

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 рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░, рдЬреЗ рдореА Python рдЖрдгрд┐ OpenCV рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ. рдЪреЗрд╣рд░рд╛ рд╢реЛрдзрд▓реНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдгреА рддреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдХрд░рддреЗ. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдВрдордзреНрдпреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдХреНрд▓рд╛рдпрдВрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╣рд╛ рдЖрдзрд╛рд░ рдЖрд╣реЗ. рддреЗ рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдбреЗрдЯрд╛ рд╡рд╛рдЪрдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рддреАрд▓.

рд▓реЗрдЦ рд╡рд╛рдЪрд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж!

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛