OpenCV ááẠááœááºáá»á°áá¬á¡ááŒááºááá±á¬áá»ááºáá»á¬ážá¡ááœáẠáá®ááá¯ááºážáá¯ááºáá¬ážáá±á¬ á
á¬ááŒáá·áºááá¯ááºáá
áºáá¯ááŒá
áºáááºá áá°áá¡ááẠ20 áá±á¬ááºááŸááá±ááŒá®á áááºážááᯠáá±á¬ááááºááœáẠá¡áá¯á¶ážááŒá¯áá²á·ááŒá®áž áá»áœááºá¯ááºá C++ ááŸáá·áº Python ááá±á¬áá»ááºáá»á¬ážá¡ááœáẠáááºážááẠááá¯áá¬áá¬á
áá¬ážáá»á¬ážá¡ááœáẠáá±á¬ááºážááœááºá
áœá¬ áá¶á·ááá¯ážáá±ážáá±á¬ááŒá±á¬áá·áº áááºážááᯠá¡áá¯á¶ážááŒá¯áá²ááŒá
áºáááºá
áá«áá±ááá·áº Go ááᯠá
áááºáá±á·áá¬ááŒá®áž á¡áá¯á¶ážááŒá¯áá²á·á¡áá« OpenCV ááᯠáá®áá¬áá¬á
áá¬ážáá²á· á¡áá¯ááºáá¯ááºááá¯á· á
áááºáááºá
á¬ážáá¬áá²á·áá«áááºá ááá¯á¡áá»áááºááœááºá áá±á«ááºážá
ááºážááŒááºážááá¯ááºáᬠááá°áá¬áá»á¬ážááŸáá·áº áááºáááºážá
á¬áá»á¬áž ááŸáááŸáá·áºááŒá®ážááŒá
áºáááºá ááá¯á·áá±á¬áº áááºážááá¯á·ááẠááŸá¯ááºááœá±ážááœááºážáááºáᯠáá»áœááºá¯ááºáááºááááºá ááá¡ááŒá¬ááœáẠThe Hybrid Group á¡ááœá²á·á០áááºáá®ážáá¬ážáá±á¬ áá¯ááºááá¯ážááŸá¯áá
áºáá¯ááᯠááœá±á·ááá¯ááºááááºá á€áá±á¬ááºážáá«ážááœááºá Haar Cascades ááŒáá·áº ááá¯ážááŸááºážáá±á¬ áá»ááºááŸá¬ááŸááºáá¬ážááŸá¯á
áá
áºááᯠáá®ááœááºááŒááºážááŒáá·áº GoCV ááᯠá
áááºááá¯ááºáá¯á¶ááᯠáááºááŒáá«áááºá
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº- áááºááœá±á·áááºáááºáž
"Python developer ááẠá¡á ááŸáá±á" .áá«ááá¯á·áááºážááá¯ááááá±ážááẠ"Habr" áá á¬áááºáá°á¡á¬ážáá¯á¶ážá¡ááœáẠ- "Habr" áááá¯ááá¯ážááŸááºážáá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áááºááá·áº Skillbox áááºáááºážááœááºá á¬áááºážááœááºážááá·áºá¡áá« 10 áá°áááºáá»áŸá±á¬á·á á»á±ážá
áááºáá¬ááá¯á¡ááºáá«ááá²
- ááœá¬áž;
- OpenCV (á¡á±á¬ááºáá« installer links);
- ááẠááá¯á·ááá¯áẠáá¯á¶ááŸáẠáá®áá®ááá¯áááºááá¬á
ustanovka
- Linux ááá¯:
gocv.io/getting-started/linux - macOS-
gocv.io/getting-started/macos - Windows ááá¯:
gocv.io/getting-started/windows
á¥ááá¬á¡á¬áž 1
áááá¥ááá¬ááœááºá áááºááá¬áá®áá®ááá¯á á®ážááŒá±á¬ááºážááŒáááá·áºáááºážááá¯ážááá¯ááœáá·áºááá·áºá¡ááºááºáá áºáá¯ááá¯áááºáá®ážááẠáá»áœááºá¯ááºááá¯á·ááŒáá¯ážá á¬ážáá«áááºá
ááááŠážá áœá¬ áááºááẠá¡áá¯ááºá¡ááœáẠááá¯á¡ááºáá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠáááºááœááºážááẠááá¯á¡ááºáááºá
áááºááœááºážááŒááºáž (
"ááŸááºáááºáž"
âgocv.io/x/gocvâ
)
áááºážááŒá®ážáá±á¬ááºá áááºááẠVideoCaptureDevice áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á VideoCapture á¡áá¬ááá¹áá¯áá áºáá¯ááᯠáááºáá®ážáááºááá¯á¡ááºáááºá áá±á¬ááºáá áºáá¯á áááºááá¬ááá¯áá¯á¶ážááŒá®áž áá®áá®ááá¯á á®ážááŒá±á¬ááºážááᯠáááºážáá°ááá¯ááºá á±áááºá áá¯ááºáá±á¬ááºáá»ááºááẠááá·áºáááºáá»ááºáá áºáá¯á¡ááŒá ẠááááºážááŒáá·áºááá¯á¡áá¯á¶ážááŒá¯ááẠ(áááºážááẠá ááºáá á¹á ááºáž ID ááá¯ááá¯ááºá á¬ážááŒá¯áááº)á
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(âerror opening web cam: %vâ, err)
}
defer webcam.Close()
ááᯠáá»áœááºá¯ááºááá¯á·ááẠn-dimensional matrix ááá¯áááºáá®ážááẠááá¯á¡ááºáá«áááºá áááºááá¬ááŸáááºáá±á¬áá¯á¶áá»á¬ážááá¯ááááºážáááºážáááá·áºáááºá
img := gocv.NewMat()
defer img.Close()
áá®áá®ááá¯á á®ážááŒá±á¬ááºážááá¯ááŒáááẠáááºááẠáááºážááá¯ážáá áºáá¯áááºáá®ážááẠááá¯á¡ááºááẠ- áááºážááᯠNewWindow áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááá¯ááºáááºá
window := gocv.NewWindow(âwebcamwindowâ)
defer window.Close()
áá² á áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶ážá¡ááá¯ááºážááᯠáááºááœá¬ážááŒáá¡á±á¬ááºá
áá®áá®ááá¯ááẠáá¯ááºáá¯á¶áá±á¬ááºáá»á¬ážá á ááºáááºáááŒááºá á®ážááŒá±á¬ááºážááŒá áºáá±á¬ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáááºááá¬ááá®áá®ááá¯á á®ážááŒá±á¬ááºážááᯠá¡áá¯á¶ážáááŸááááºááŸá¯ááá¯ááºá á±ááẠá¡áá¯á¶ážáá²á·ááœááºážáááºáá áºáá¯ááᯠáááºáá®ážááẠááá¯á¡ááºáá«áááºá áá«ááá¯áá¯ááºááá¯á·á VideoCapture á¡áá»áá¯ážá¡á á¬ážáá²á· Read method ááá¯ááá¯á¡ááºáá«áááºá VideoCapture ááŸáá±á¬ááºááᯠá¡á±á¬ááºááŒááºá áœá¬áááºááŒááºážááŸáá áááŸáááᯠááœáŸááºááŒááá·áº boolean áááºááá¯ážááᯠááŒááºáá±ážááá·áº Mat á¡áá»áá¯ážá¡á á¬áž (á¡áááºááœáẠáá»áœááºá¯ááºááá¯á· áááºáá®ážáá¬ážáá±á¬ matrix ááᯠáá»áŸá±á¬áºááá·áºáá«áááºá
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 ááá¯á¡ááŒá±áá¶á áá»ááºááŸá¬ááŸááºááááŒááºážá áá áºááᯠáááºáá±á¬ááºááŒáá«á áá¯á·á
Haar cascades áá»á¬ážááẠHaar wavelet áááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯á áá±á·áá»áá·áºáááºááŒá¬ážáá¬ážáá±á¬ áá¬á ááááºá¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŒá áºáááºá áááºážááá¯á·ááẠá¡áá»áá¯á·áá±á¬á¡ááºá¹áá«áááºáá»á¬ážááᯠááááŸáááá¯ááºááẠáá¯á¶ááŸá pixels áá»á¬ážááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬áááºá Haar Cascades á¡ááŒá±á¬ááºáž ááá¯ááá¯ááááŸáááá¯áá«á á¡á±á¬ááºáá«ááá·áºááºáá»á¬ážááᯠááŸáááºáá«á
áá±á·áá»áá·áºááŒá®ážáá¬áž áá±á«ááºážáá¯ááºáá¯ááºáá«á
áá®ááá¯áá¯ááºááá¯á·á á¡áá»áá¯ážá¡á á¬ážááœá²áááºážáá áºáá¯áááºáá®ážááŒá®áž áá±á·áá»áá·áºááŒá®ážáá¬ážááá¯ááºááᯠáá»áœá±ážááá¯á· ááá¯á¡ááºáá«ááẠ(á¡áááºááŸá¬áá±ážáá¬ážáá²á· link áá«)á 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 á០á¡ááŒá¶ááŒá¯áá¬ážáááº-
- ááŸá áºááŸá áºá á¬áááºááœá±á·áááºáááºáž
"áá»áœááºáá±á¬áºá PRO ááẠdeveloper áá áºáá±á¬ááºáá«" .- ááá¬áá±ážá¡áœááºááá¯ááºážáááºáááºáž
"Profession Java developer" .- áááºááœá±á· áá áºááŸá áºáááºáááºáž
"PHP developer 0 á០PRO" .
source: www.habr.com