OpenCV рдХрдореНрдкреНрдпреБрдЯрд░ рджреГрд╖реНрдЯрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛред рдЙрдиреА рдкрд╣рд┐рд▓реЗ рдиреИ рдХрд░рд┐рдм реиреж рд╡рд░реНрд╖рдХреА рднрдЗрдиреНред рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдХрд▓реЗрдЬрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВ рд░ рдЕрдЭреИ рдкрдирд┐ рдпрд╕рд▓рд╛рдИ рдореЗрд░реЛ C++ рд░ рдкрд╛рдЗрдерди рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреБ рдХрд┐рдирднрдиреЗ рдпрд╕рдорд╛ рддреА рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛ рд╕рдорд░реНрдерди рдЫред
рддрд░ рдЬрдм рдореИрд▓реЗ рд╕рд┐рдХреНрди рд░ Go рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдерд╛рд▓реЗрдВ, рдорд▓рд╛рдИ рдпреЛ рднрд╛рд╖рд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди OpenCV рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдХрд┐ рднрдиреЗрд░ рдЪрд╛рд╕реЛ рднрдпреЛред рддреНрдпрд╕ рд╕рдордпрдорд╛, рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд░ рдПрдХреАрдХрд░рдгрдорд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рд╣рд░реВ рдерд┐рдП, рддрд░ рдпреЛ рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛ рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рдзреЗрд░реИ рдЬрдЯрд┐рд▓ рдерд┐рдПред рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐, рдореИрд▓реЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рдореВрд╣ рдЯреЛрд▓реА рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИрдПрдХреЛ рд░реНрдпрд╛рдкрд░ рднреЗрдЯреЗрдВред рдпрд╕ рд▓реЗрдЦрдорд╛, рдо рддрдкрд╛рдЗрдБрд▓рд╛рдИ рд╣рд╛рд░ рдХреНрдпрд╛рд╕реНрдХреЗрдбрдХреЛ рд╕рд╛рде рд╕рд░рд▓ рдЕрдиреБрд╣рд╛рд░ рдкрд╣рд┐рдЪрд╛рди рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╛рд╕ рдЧрд░реЗрд░ GoCV рд╕рдБрдЧ рдХрд╕рд░реА рд╕реБрд░реБ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдкрд╛рдЗрдерди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред
рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЫ:
- рдЬрд╛рдиреБрд╣реЛрд╕реН;
- OpenCV (рддрд▓ рд╕реНрдерд╛рдкрдирд╛рдХрд░реНрддрд╛ рд▓рд┐рдЩреНрдХрд╣рд░реВ);
- рд╡реЗрдм рд╡рд╛ рдирд┐рдпрдорд┐рдд рднрд┐рдбрд┐рдпреЛ рдХреНрдпрд╛рдореЗрд░рд╛ред
рд╕реЗрдЯрд┐рдЩ
- рд▓рд┐рдирдХреНрд╕:
gocv.io/getting-started/linux - рдореНрдпрд╛рдХреЛрд╕:
gocv.io/getting-started/macos - рд╡рд┐рдиреНрдбреЛрдЬ:
gocv.io/getting-started/windows
рдЙрджрд╛рд╣рд░рдгрдХрд╛ 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)
рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╕реБрд░реБ рдЧрд░реЗрдкрдЫрд┐, рдХреНрдпрд╛рдореЗрд░рд╛рдмрд╛рдЯ рднрд┐рдбрд┐рдпреЛ рд╕реНрдЯреНрд░рд┐рдо рднрдПрдХреЛ рд╡рд┐рдиреНрдбреЛ рдЦреБрд▓реНрдиреЗрдЫред
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()
рдЫрд╡рд┐рдорд╛ рдЕрдиреБрд╣рд╛рд░рд╣рд░реВ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди, рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ
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 рд▓рд╛рдИ рд╕рдВрдпреЛрдЬрди рдЧрд░реЗрд░ рдирдпрд╛рдБ рдЙрддреНрдХреГрд╖реНрдЯ рдЪреАрдЬрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рдЧрд░реНрдЫреБред
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЗрдЪреНрдЫреБрдХ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдХреГрдкрдпрд╛ рдореВрд▓реНрдпрд╛рдЩреНрдХрди рдЧрд░реНрдиреБрд╣реЛрд╕реН
рд▓реЗрдЦ рдкрдвреНрдиреБ рднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рдж!
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:
- рджреБрдИ рд╡рд░реНрд╖реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рдо рдПрдХ рдкреНрд░реЛ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд╣реБрдБ" .- рд╢реИрдХреНрд╖рд┐рдХ рдЕрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо
"рдкреЗрд╢реЗ рдЬрд╛рднрд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .- рдПрдХ рд╡рд░реНрд╖рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"0 рджреЗрдЦрд┐ PRO рдорд╛ PHP рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .
рд╕реНрд░реЛрдд: www.habr.com