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