
OpenCV — biblioteka opracowana dla projektów związanych z komputerowym widzeniem. Istnieje już od około 20 lat. Używałem jej jeszcze w college'u i do tej pory stosuję w swoich projektach w C++ i Pythonie, ponieważ ma dobrą obsługę tych języków.
Jednak kiedy zacząłem uczyć się i używać Go, zainteresowało mnie, czy można zastosować OpenCV do pracy z tym językiem. Wtedy istniały już przykłady i samouczki dotyczące integracji, ale wydawały mi się zbyt skomplikowane. Niedługo potem natknąłem się na wrappera stworzonego przez zespół The Hybrid Group. W tym artykule pokażę, jak zacząć z GoCV, tworząc prosty system rozpoznawania twarzy przy użyciu kaskad Haar.
Skillbox poleca: Praktyczny kurs .
Przypominamy: dla wszystkich czytelników „Habra” — zniżka 10 000 rubli przy zapisie na dowolny kurs Skillbox z kodem promocyjnym „Habra”.
Co będzie potrzebne:
- Go;
- OpenCV (linki do instalatora poniżej);
- kamera internetowa lub zwykła kamera wideo.
Instalacja
- Linux:
- macOS:
- Windows:
Przykład 1
W pierwszym przykładzie spróbujemy stworzyć aplikację, która otwiera okno z demonstracją strumienia wideo z kamery.
Najpierw musimy zaimportować biblioteki potrzebne do pracy.
import (
“log”
“gocv.io/x/gocv”
)
Następnie należy stworzyć obiekt VideoCapture przy użyciu funkcji VideoCaptureDevice. Ta ostatnia pozwala na przechwytywanie strumienia wideo z kamery. W funkcji używa się liczby całkowitej jako parametru (reprezentuje ona ID urządzenia).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“błąd podczas otwierania kamery internetowej: %v”, err)
}
defer webcam.Close()Teraz należy stworzyć n-wymiarową macierz. Będzie ona przechowywać obrazy odczytane z kamery.
img := gocv.NewMat()
defer img.Close()Aby wyświetlić strumień wideo, należy stworzyć okno — można to zrobić przy pomocy funkcji NewWindow.
window := gocv.NewWindow(“webcamwindow”)
defer window.Close()Teraz przejdźmy do najciekawszej części.
Ponieważ wideo to ciągły strumień klatek-obrazu, musimy stworzyć nieskończoną pętlę do ciągłego odczytu strumienia wideo z kamery. Do tego potrzebna jest metoda Read typu VideoCapture. Będzie ona oczekiwała typu Mat (macierz, którą stworzyliśmy wyżej), zwracając wartość logiczną, która wskazuje, czy klatka z VideoCapture została pomyślnie odczytana czy nie.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(“Nie można odczytać z kamery internetowej”) continue
}
.
.
.
}Teraz trzeba wyświetlić ramkę w utworzonym oknie. Przerwa na przejście do następnej ramki - 50 ms.
window.IMShow(img)
window.WaitKey(50)
Po uruchomieniu aplikacji otworzy się okno z strumieniem wideo z kamery.

package main
import (
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("błąd otwierania urządzenia: %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("Nie można odczytać z kamerki")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}Przykład 2
W tym przykładzie skorzystajmy z poprzedniego przykładu i zbudujmy system rozpoznawania twarzy oparty na Haar Cascades (kaskady Haara).
Kaskady Haara to kaskadowe klasyfikatory, które są trenowane w oparciu o technikę falkową Haara. Analizują piksele w obrazie, aby wykryć określone cechy. Aby dowiedzieć się więcej o Haar Cascades, można przejść do linków poniżej.
Pobierz już wytrenowane kaskady . W bieżącym przykładzie kaskady będą używane do identyfikacji twarzy człowieka z przodu.
Aby to zrobić, należy stworzyć klasyfikator i dostarczyć mu już wytrenowany plik (link podany powyżej). Już załadowałem plik opencv_haarcascade_frontalface_default.xml do katalogu, w którym znajduje się nasz program.
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()Aby wykrywać twarze na obrazie, należy skorzystać z metody . Funkcja ta przyjmuje klatkę (typ Mat), która została właśnie odczytana ze strumienia wideo kamery, i zwraca tablicę typu Rectangle. Rozmiar tablicy reprezentuje liczbę twarzy, które klasyfikator był w stanie wykryć w klatce. Następnie, aby upewnić się, że widzimy to, co znalazł, przejdźmy przez listę prostokątów i wyświetlmy obiekt Rectangle w konsoli, tworząc ramkę wokół wykrytego prostokąta. Można to zrobić za pomocą funkcji Rectangle. Przyjmuje ona Mat, odczytany z kamery, obiekt Rectangle, który został zwrócony przez metodę DetectMultiScale, kolor i grubość ramki.
for _, r := range rects {
fmt.Println(“wykryto”, r)
gocv.Rectangle(&img, r, color, 2)
} 

pakiet główny
import (
"fmt"
"image/color"
"log"
"gocv.io/x/gocv"
)
funkcja main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("błąd przy otwieraniu kamery internetowej: %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("Nie można odczytać z urządzenia")
continue
}
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("wykryto", r)
gocv.Rectangle(&img, r, color, 3)
}
window.IMShow(img)
window.WaitKey(50)
}
}Tak, udało się! Mamy teraz prosty system rozpoznawania twarzy, napisany w Go. Wkrótce planuję kontynuować te eksperymenty i stworzyć nowe ciekawe rzeczy, łącząc Go i OpenCV.
Jeśli jesteś zainteresowany, oceniaj , który napisałem w Pythonie i OpenCV. Transmituje dane w momencie wykrycia twarzy. To podstawa do tworzenia różnych klientów w różnych językach programowania. Będą mogli łączyć się z serwerem i odczytywać z niego dane.
Dziękuję za przeczytanie artykułu!
Skillbox poleca:
- Dwuletni praktyczny kurs .
- Edukacyjny kurs online .
- Praktyczny roczny kurs .
Źródło: habr.com
