Код для "тренировок".
C-like:
package main
import (
"fmt"
"gocv.io/x/gocv"
"image"
"image/color"
)
func main() {
// Установим ID камеры
deviceID := 0
// Установим путь к XML файлу классификатора
xmlFile := "haarcascade_frontalface_default.xml"
// Открываем веб-камеру
webcam, err := gocv.VideoCaptureDevice(deviceID)
if err != nil {
fmt.Println(err)
return
}
defer webcam.Close()
// Открываем окно отображения
window := gocv.NewWindow("Face Detect")
defer window.Close()
// Подготавливаем матрицу изображения
img := gocv.NewMat()
defer img.Close()
// Цвет для прямоугольника, когда лица обнаружены
blue := color.RGBA{0, 0, 255, 0}
// Загружаем классификатор для распознавания лиц
classifier := gocv.NewCascadeClassifier()
defer classifier.Close()
if !classifier.Load(xmlFile) {
fmt.Printf("Error reading cascade file: %vn", xmlFile)
return
}
fmt.Printf("start reading camera device: %vn", deviceID)
for {
if ok := webcam.Read(&img); !ok {
fmt.Printf("cannot read device %dn", deviceID)
return
}
if img.Empty() {
continue
}
// Зеркально отобразить изображение
gocv.Flip(img, &img, -1) // 0 - вертикальное отражение, 1 - горизонтальное, -1 - и вертикальное, и горизонтальное
// Обнаруживаем лица
rects := classifier.DetectMultiScale(img)
fmt.Printf("found %d facesn", len(rects))
// Рисуем прямоугольник вокруг каждого лица на оригинальном изображении,
// вместе с текстом "Human"
for _, r := range rects {
gocv.Rectangle(&img, r, blue, 3)
size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2)
pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2)
gocv.PutText(&img, "Human", pt, gocv.FontHersheyPlain, 1.2, blue, 2)
}
// Показываем изображение в окне и ждем 1 миллисекунду
window.IMShow(img)
if window.WaitKey(1) >= 0 {
break
}
}
}