
OpenCV е библиотека, разработена за проекти в областта на компютърното зрение. Тя е на около 20 години. Използвах я още в колежа и все още я прилагам за своите проекти на C++ и Python, тъй като има добра поддръжка за тези езици.
Но когато започнах да изучавам и използвам Go, ми стана интересно дали е възможно да се прилага OpenCV с този език. В това време имаше примери и уроци за интеграция, но ми се стори, че те са твърде сложни. Малко по-късно попаднах на обвивка, създадена от екипа на The Hybrid Group. В тази статия ще покажа как да започнем с GoCV, разработвайки проста система за разпознаване на лица с каскади на Хаар.
Skillbox препоръчва: Практически курс .
Напомняме: за всички читатели на "Хабра" — отстъпка от 10 000 рубли при записване на всякакъв курс на Skillbox с промокод "Хабр".
Какво е необходимо:
- Go;
- OpenCV (връзки към инсталатора по-долу);
- уеб или обикновена видеокамера.
Инсталиране
- Linux:
- macOS:
- API, предоставяно от операционната система (full-screen-api.macos-native-full-screen), което позволи унифицирането на вида и поведението на елементите на екрана.
Пример 1
В първия пример ще се опитаме да създадем приложение, което отваря прозорец с демонстрация на видеопотока от камерата.
Първо трябва да импортираме библиотеките, необходими за работа.
import (
“log”
“gocv.io/x/gocv”
)
След това трябва да създадем обект VideoCapture, като използваме функцията 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()Сега преминаваме към най-интересната част.
Тъй като видеото представлява непрекъснат поток от кадри, ще трябва да създадем безкраен цикъл за непрекъснато четене на видеопотока от камерата. За това е необходим метод Read от типа VideoCapture. Той ще очаква тип Mat (матрица, която създадохме по-горе), връщайки логическа стойност, указваща дали кадърът от VideoCapture е бил успешно прочетен или не.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}Сега трябва да покажем кадъра в създадения прозорец. Пауза за преминаване към следващия кадър — 50 мс.
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 Cascades можете да посетите линковете по-долу.
Изтеглете предварително обучени каскади . В текущия пример каскадите ще се използват за идентифициране на лицето на човек в профил.
За да направите това, трябва да създадете класификатор и да му подадете вече обучен файл (линкът по-горе). Аз вече качих файла opencv_haarcascade_frontalface_default.xml в директорията, където се намира нашата програма.
harrcascade := "opencv_haarcascade_frontalface_default.xml"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()За откриване на лица в изображението трябва да използвате метода . Тази функция приема кадър (тип Mat), който току-що е прочетен от видео потока на камерата, и връща масив от типа Rectangle. Размерът на масива представлява броя на лицата, които класификаторът е успял да открие в кадъра. След това, за да се уверим, че виждаме това, което е намерил, нека да прегледаме списъка с правоъгълници и да изведем обект Rectangle на конзолата, създавайки граница около открития правоъгълник. Това може да се направи с помощта на функцията Rectangle. Тя ще приема Mat, прочетен от камерата, обект Rectangle, който е бил върнат от метода DetectMultiScale, цвет и дебелина за границата.
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 2)
} 

пакет main
импорт (
"fmt"
"image/color"
"log"
"gocv.io/x/gocv"
)
функция main() {
вебкамера, err := gocv.VideoCaptureDevice(0)
если err != nil {
log.Fatalf("грешка при отварянето на уеб камерата: %v", err)
}
отложи вебкамера.Close()
img := gocv.NewMat()
отложи img.Close()
прозорец := gocv.NewWindow("webcamwindow")
отложи прозорец.Close()
harrcascade := "opencv_haarcascade_frontalface_default.xml"
классификатор := gocv.NewCascadeClassifier()
класификатор.Load(harrcascade)
отложи класификатор.Close()
цвят := color.RGBA{0, 255, 0, 0}
за {
ако ok := вебкамера.Read(&img); !ok || img.Empty() {
log.Println("Невъзможно е да се прочете от устройството")
продължи
}
прецизност := класификатор.DetectMultiScale(img)
за _, r := диапазон прецизности {
fmt.Println("открито", r)
gocv.Rectangle(&img, r, цвят, 3)
}
прозорец.IMShow(img)
прозорец.WaitKey(50)
}
}И… да, всичко стана! Сега имаме проста система за разпознаване на лица, написана на Go. В скоро време планирам да продължа тези експерименти и да създам нови интересни неща, комбинирайки Go и OpenCV.
Ако ви е интересно, дайте оценка , който написах на Python и OpenCV. Той предава данни в момента на откритие на лице. Това е основа за създаване на различни клиенти на различни програмни езици. Те ще могат да се свързват със сървъра и да четат данни от него.
Благодаря, че прочетохте статията!
Skillbox препоръчва:
- Двугодишен практически курс .
- Образователен онлайн курс .
- Практически годишен курс .
Източник: habr.com
