Golang рд░ OpenCV рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрд╣рд╛рд░ рдкрд╣рд┐рдЪрд╛рди рдкреНрд░рдгрд╛рд▓реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ

Golang рд░ OpenCV рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрд╣рд╛рд░ рдкрд╣рд┐рдЪрд╛рди рдкреНрд░рдгрд╛рд▓реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ
OpenCV рдХрдореНрдкреНрдпреБрдЯрд░ рджреГрд╖реНрдЯрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛред рдЙрдиреА рдкрд╣рд┐рд▓реЗ рдиреИ рдХрд░рд┐рдм реиреж рд╡рд░реНрд╖рдХреА рднрдЗрдиреНред рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдХрд▓реЗрдЬрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВ рд░ рдЕрдЭреИ рдкрдирд┐ рдпрд╕рд▓рд╛рдИ рдореЗрд░реЛ C++ рд░ рдкрд╛рдЗрдерди рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреБ рдХрд┐рдирднрдиреЗ рдпрд╕рдорд╛ рддреА рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛ рд╕рдорд░реНрдерди рдЫред

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

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдкрд╛рдЗрдерди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛".

рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЫ:

  • рдЬрд╛рдиреБрд╣реЛрд╕реН;
  • OpenCV (рддрд▓ рд╕реНрдерд╛рдкрдирд╛рдХрд░реНрддрд╛ рд▓рд┐рдЩреНрдХрд╣рд░реВ);
  • рд╡реЗрдм рд╡рд╛ рдирд┐рдпрдорд┐рдд рднрд┐рдбрд┐рдпреЛ рдХреНрдпрд╛рдореЗрд░рд╛ред

рд╕реЗрдЯрд┐рдЩ

рдЙрджрд╛рд╣рд░рдгрдХрд╛ 1

рдкрд╣рд┐рд▓реЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рдХреНрдпрд╛рдореЗрд░рд╛ рднрд┐рдбрд┐рдпреЛ рд╕реНрдЯреНрд░рд┐рдо рджреЗрдЦрд╛рдЙрдиреЗ рд╡рд┐рдиреНрдбреЛ рдЦреЛрд▓реНрдЫред

рдкрд╣рд┐рд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдХрд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЖрдпрд╛рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЖрдпрд╛рдд (
"рд▓рдЧ"
"gocv.io/x/gocv"
)

рдпрд╕ рдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ VideoCaptureDevice рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рднрд┐рдбрд┐рдпреЛ рдХреНрдпрд╛рдкреНрдЪрд░ рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдкрдЫрд┐рд▓реНрд▓реЛрд▓реЗ рдХреНрдпрд╛рдореЗрд░рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рднрд┐рдбрд┐рдпреЛ рд╕реНрдЯреНрд░рд┐рдо рдЦрд┐рдЪреНрди рд╕рдореНрднрд╡ рдмрдирд╛рдЙрдБрдЫред рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдХреЛ рд░реВрдкрдорд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ (рдпрд╕рд▓реЗ рдпрдиреНрддреНрд░ 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)

рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╕реБрд░реБ рдЧрд░реЗрдкрдЫрд┐, рдХреНрдпрд╛рдореЗрд░рд╛рдмрд╛рдЯ рднрд┐рдбрд┐рдпреЛ рд╕реНрдЯреНрд░рд┐рдо рднрдПрдХреЛ рд╡рд┐рдиреНрдбреЛ рдЦреБрд▓реНрдиреЗрдЫред

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 рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрд╣рд╛рд░ рдкрд╣рд┐рдЪрд╛рди рдкреНрд░рдгрд╛рд▓реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реМрдВред

рд╣рд╛рд░ рдХреНрдпрд╛рд╕реНрдХреЗрдбрд╣рд░реВ рдХреНрдпрд╛рд╕реНрдХреЗрдб рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛рд╣рд░реВ рд╣реБрдиреН рдЬреБрди рд╣рд╛рд░ рд╡реЗрднрд▓реЗрдЯ рдкреНрд░рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реБрдиреНрдЫрдиреНред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рдЫрд╡рд┐рдорд╛ рдкрд┐рдХреНрд╕реЗрд▓рд╣рд░реВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдЫрдиреНред рд╣рд╛рд░ рдХреНрдпрд╛рд╕реНрдХреЗрдбрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдЬрд╛рдиреНрдирдХреЛ рд▓рд╛рдЧрд┐, рдХреГрдкрдпрд╛ рддрд▓рдХреЛ рд▓рд┐рдЩреНрдХрд╣рд░реВ рдкрдЫреНрдпрд╛рдЙрдиреБрд╣реЛрд╕реНред

Viola-Jones рд╡рд╕реНрддреБ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ
рдХреНрдпрд╛рд╕реНрдХреЗрдбрд┐рдЩ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рд╣рд░реВ
рд╣рд╛рд░ рдЬрд╕реНрддреЛ рд╕реБрд╡рд┐рдзрд╛

рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХреНрдпрд╛рд╕реНрдХреЗрдбрд╣рд░реВ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН рдпрд╣рд╛рдБ рд╣реБрди рд╕рдХреНрдЫред рд╣рд╛рд▓рдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, рдХреНрдпрд╛рд╕реНрдХреЗрдбрд╣рд░реВ рдЕрдЧрд╛рдбрд┐рдмрд╛рдЯ рд╡реНрдпрдХреНрддрд┐рдХреЛ рдЕрдиреБрд╣рд╛рд░ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдПрдХ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рд░ рдпрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдлрд╛рдЗрд▓ рдлрд┐рдб рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (рд▓рд┐рдЩреНрдХ рдорд╛рдерд┐ рджрд┐рдЗрдПрдХреЛ рдЫ)ред рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд░рд╣реЗрдХреЛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ 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)
}

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 рд╡реЗрдм рд╕рд░реНрднрд░, рдЬреБрди рдореИрд▓реЗ рдкрд╛рдЗрдерди рд░ OpenCV рдорд╛ рд▓реЗрдЦреЗрдХреЛ рдЫреБред рдЕрдиреБрд╣рд╛рд░ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрдиреЗ рдмрд┐рддреНрддрд┐рдХреИ рдпрд╕рд▓реЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдо рдЧрд░реНрджрдЫред рдпреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВрдорд╛ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рд╣рдХрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдЖрдзрд╛рд░ рд╣реЛред рддрд┐рдиреАрд╣рд░реВ рд╕рд░реНрднрд░рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рд░ рддреНрдпрд╕рдмрд╛рдЯ рдбрд╛рдЯрд╛ рдкрдвреНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫрдиреНред

рд▓реЗрдЦ рдкрдвреНрдиреБ рднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рдж!

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди