OpenCV ืืื ืึท ืืืืืืึธืืขืง ืืืืืื ื ืคึฟืึทืจ ืงืึธืืคึผืืืืขืจ ืืขืืื ื ืคึผืจืึทืืืฉืขืงืก. ืื ืืื ืฉืืื ืืื ืืขืจื 20 ืืืจ. ืืื ืืขืืืืื ื ืขืก ืืื ืงืึธืืขืืข ืืื ื ืึธื ื ืืฆื ืขืก ืคึฟืึทืจ ืืืื C ++ ืืื ืคึผืืืืึธื ืคึผืจืึทืืืฉืขืงืก ืืืืึทื ืขืก ืืื ืืื ืฉืืืฆื ืคึฟืึทืจ ืื ืฉืคึผืจืึทืื.
ืึธืืขืจ ืืืขื ืืื ืกืืึทืจืืขื ืืขืจื ืขื ืืื ื ืืฆื Go, ืืื ืืขืืืืจื ืืื ืืขืจืขืกืืจื ืืื ืฆื OpenCV ืงืขื ืืืื ืืขืืืืื ื ืฆื ืึทืจืืขืื ืืื ืืขื ืฉืคึผืจืึทื. ืืื ืืขืจ ืฆืืื, ืขืก ืืขื ืขื ืฉืืื ืืืืฉืคืืื ืืื ืืืืึธืจืืึทืื ืืืืฃ ืื ืืึทืืจืืืฉืึทื, ืึธืืขืจ ืขืก ืืขืืืขื ืฆื ืืืจ ืึทื ืืื ืืขื ืขื ืืขืืืขื ืฆื ืงืึธืืคึผืืืฆืืจื. ื ืืืกื ืฉืคึผืขืืขืจ, ืืื ืืขืคึฟืื ืขื ืึท ืจืึทืคึผืขืจ ืืืฉืืคื ืืืจื ืื ืืืืจืื ืืจืืคืข ืืึทื ืฉืึทืคึฟื. ืืื ืืขื ืึทืจืืืงื, ืืื ืืืขื ืืืืึทืื ืืืจ ืืื ืฆื ืึธื ืืืืื ืืื GoCV ืืืจื ืืขืืืขืืึธืคึผืื ื ืึท ืคึผืฉืื ืคึผื ืื ืืขืจืงืขื ืื ื ืกืืกืืขื ืืื Haar Cascades.
Skillbox ืจืขืงืึทืืขื ืื: ืคึผืจืึทืงืืืฉ ืงืืจืก
"Python ืืขืืืขืืึธืคึผืขืจ ืคึฟืื ืงืจืึทืฆื" .ืืืจ ืืขืจืืึธื ืขื ืืืจ: ืคึฟืึทืจ ืึทืืข ืืืืขื ืขืจ ืคืื "ืืืจ" - ืึท ืึทืจืึธืคึผืจืขืืขื ืขื ืคืื 10 ืจืืื ืืืขื ืืืจ ืคืึทืจืฉืจืืึทืื ืืื ืงืืื ืกืงืืืืึธืงืก ืงืืจืก ื ืืฆื ืื ืคึผืขืจืืึธืืฉืึทื ืึทื ืงืึธื "ืืืจ".
ืืืึธืก ืืื ืคืืจืืื ืื:
- ืืืื;
- OpenCV (ืื ืกืืึทืืืขืจ ืืื ืงืก ืืื ืื);
- ืืืขื ืึธืืขืจ ืจืขืืืืขืจ ืืืืืขื ืึทืคึผืึทืจืึทื.
ืื ืกืืึทืืืจืื ื
- ืืื ืืงืก:
gocv.io/getting-started/linux - macOS:
gocv.io/getting-started/macos - ืคึฟืขื ืฆืืขืจ:
gocv.io/getting-started/windows
ืืืึทืฉืคึผืื ืงืกื ืืืงืก
ืืื ืืขืจ ืขืจืฉืืขืจ ืืืึทืฉืคึผืื, ืืืจ ืืืขืื ืคึผืจืืืืจื ืฆื ืฉืึทืคึฟื ืึท ืึทืคึผืืึทืงืืืฉืึทื ืืืึธืก ืขืคึฟื ื ืึท ืคึฟืขื ืฆืืขืจ ืืื ืึท ืึทืคึผืึทืจืึทื ืืืืืขื ืืืึทื.
ืขืจืฉืืขืจ ืืืจ ืืึทืจืคึฟื ืฆื ืึทืจืืึทื ืคืืจ ืื ืืืืืจืขืจืื ืืืจืฃ ืคึฟืึทืจ ืึทืจืืขื.
ืึทืจืืึทื ืคืืจ (
"ืงืืึธืฅ"
"gocv.io/x/gocv"
)
ื ืึธื ืืขื, ืืืจ ืืึทืจืคึฟื ืฆื ืฉืึทืคึฟื ืึท VideoCapture ืืืืคืขืฅ ื ืืฆื ืื VideoCaptureDevice ืคืื ืงืฆืืข. ืื ืืขื ืขืจ ืืืื ืขืก ืืขืืืขื ืฆื ืืึทืคึผื ืึท ืืืืืขื ืืืึทื ืืื ืึท ืึทืคึผืึทืจืึทื. ืื ืคึฟืื ืงืฆืืข ื ืืฆื ืึท ืืึทื ืฅ ื ืืืขืจ ืืื ืึท ืคึผืึทืจืึทืืขืืขืจ (ืขืก ืจืขืคึผืจืึทืืขื ืฅ ืื ืืืื ืฉืืึทื).
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()
ืืืฆื ืืึธืืืจ ืืืื ืฆื ืื ืืขืจืกื ืืฉืืงืึทืืืข ืืืื.
ืืื ื ืืืืืขื ืืื ืึท ืงืขืกืืืืขืจืืืง ืืืึทื ืคืื ืืืื ืจืึธืืขื, ืืืจ ืืึทืจืคึฟื ืฆื ืฉืึทืคึฟื ืึท ืื ืคืึทื ืึทื ืฉืืืืฃ ืฆื ืขื ืืืึทืกืื ืืืืขื ืขื ืื ืืืืืขื ืืืึทื ืคืื ืื ืึทืคึผืึทืจืึทื. ืฆื ืืึธื ืืึธืก, ืืืจ ืืึทืจืคึฟื ืื ืืืืขื ืขื ืืืคึฟื ืคืื ืืขื ืืืคึผ VideoCapture. ืขืก ืืืขื ืืขืจืืืึทืจืื ืึท ืืึทืืข ืืืคึผ (ืื ืืึทืืจืืฅ ืืืจ ืืืฉืืคื ืืืืื), ืืืึธืก ืืืขื ืฆืืจืืงืงืืืขื ืึท ืืืืืึทื ืืืขืจื ืืืึธืก ืื ืืืงืืืฅ ืฆื ืื ืจืึทื ืคืื ืื ืืืืืขืึธืงืึทืคึผืืืจืข ืืื ืืืืขื ืขื ืืฆืืื ืึธืืขืจ ื ืืฉื.
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(โUnable to read from the webcamโ) continue
}
.
.
.
}
ืืืฆื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืึทืื ืื ืจืึทื ืืื ืื ืืืฉืืคื ืคึฟืขื ืฆืืขืจ. ืื ืคึผืืืืข ืคึฟืึทืจ ืืึธืืืื ื ืฆื ืืขืจ ืืืืึทืืขืจ ืจืึทื ืืื 50 ืืื.
window.IMShow (img)
ืืืื ืืึธื.ืืืืืืงืื (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)
}
}
ืืืึทืฉืคึผืื ืงืกื ืืืงืก
ืืื ืืขื ืืืึทืฉืคึผืื, ืืึธืื ืืื ืื ื ืืฆื ืืขื ืคืจืืขืจืืืงื ืืืึทืฉืคึผืื ืืื ืืืืขื ืึท ืคึผื ืื ืืขืจืงืขื ืื ื ืกืืกืืขื ืืืืืจื ืืืืฃ Haar Cascades.
ืืึทืึทืจ ืงืึทืกืงืึทืืขืก ืืขื ืขื ืงืึทืกืงืืื ืงืืึทืกืกืืคืืขืจืก ืืืึธืก ืืขื ืขื ืืจืืื ื ืืื ืื ืืึทืึทืจ ืืืึทืืืขืืขื ืืขืื ืืง. ืืื ืึทื ืึทืืืื ืื ืืืืืฆืขืื ืืื ืึท ืืืื ืฆื ืืขืืขืงื ืืืืขืจ ืคึฟืขืึดืงืืืื. ืฆื ืืขืคึฟืื ืขื ืืขืจ ืืืขืื 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 ืจืขืงืึทืืขื ืื:
- ืฆืืืื-ืืึธืจ ืคึผืจืึทืงืืืฉ ืงืืจืก
"ืืื ืืื ืึท ืคึผืจืึธ ืืืขื ืืขืืืขืืึธืคึผืขืจ" .- ืืืืืื ืืงืจืืื ืึธื ืืืื ืงืืจืก
"ืคืึทื ืืืฉืึทืืืึท ืืขืืืขืืึธืคึผืขืจ" .- ืคึผืจืึทืงืืืฉ ืืึธืจ ืงืืจืก
"PHP ืืขืืืขืืึธืคึผืขืจ ืคึฟืื 0 ืฆื ืคึผืจืึธ" .
ืืงืืจ: www.habr.com