Golang eta OpenCV-n oinarritutako aurpegiak ezagutzeko sistema eraikitzea

Golang eta OpenCV-n oinarritutako aurpegiak ezagutzeko sistema eraikitzea
OpenCV ordenagailu bidezko ikusmeneko proiektuetarako diseinatutako liburutegia da. 20 urte inguru ditu jada. Unibertsitatean erabili nuen eta oraindik ere erabiltzen dut nire C++ eta Python proiektuetarako, hizkuntza horietarako laguntza ona duelako.

Baina Go ikasten eta erabiltzen hasi nintzenean, interesa piztu zitzaidan ea OpenCV hizkuntza honekin lan egiteko erabil ote zen. Garai hartan jada bazeuden integrazioari buruzko adibideak eta tutorialak, baina korapilatsuegiak zirela iruditu zitzaidan. Pixka bat geroago, The Hybrid Group taldeak sortutako bilgarri batekin egin nuen topo. Artikulu honetan, GoCVrekin nola hasi Haar Cascades-ekin aurpegia ezagutzeko sistema sinple bat garatuz erakutsiko dizut.

Skillbox-ek gomendatzen du: Ikastaro praktikoa "Python garatzailea hutsetik".

Gogoratzen dugu: "Habr" irakurle guztientzat - 10 errubloko deskontua "Habr" promozio-kodea erabiliz Skillbox-eko edozein ikastarotan izena ematean.

Zer behar da:

  • Joan;
  • OpenCV (instalatzailearen estekak behean);
  • web edo ohiko bideo kamera.

Instalazio-

Adibidez 1

Lehenengo adibidean, kameraren bideo-korrontea erakusten duen leiho bat irekitzen duen aplikazio bat sortzen saiatuko gara.

Lehenik eta behin lanerako beharrezkoak diren liburutegiak inportatu behar dituzu.

inportatu (
"erregistroa"
"gocv.io/x/gocv"
)

Horren ondoren, VideoCapture objektu bat sortu behar duzu VideoCaptureDevice funtzioa erabiliz. Azken honek bideo-korronte bat ateratzeko aukera ematen du kamera baten bidez. Funtzioak zenbaki oso bat erabiltzen du parametro gisa (gailuaren IDa adierazten du).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(β€œerror opening web cam: %v”, err)
}
defer webcam.Close()

Orain n dimentsioko matrize bat sortu behar dugu. Kameratik irakurritako irudiak gordeko ditu.

img := gocv.NewMat()
defer img.Close()

Bideo korronte bat bistaratzeko, leiho bat sortu behar duzu; hau NewWindow funtzioa erabiliz egin daiteke.

window := gocv.NewWindow(β€œwebcamwindow”)
defer window.Close()

Orain pasa gaitezen parterik interesgarrienera.

Bideoa irudi-markoen etengabeko jarioa denez, begizta infinitua sortu beharko dugu kameraren bideo-korrontea etengabe irakurtzeko. Horretarako, VideoCapture motako Read metodoa behar duzu. Mat mota bat espero du (goian sortu dugun matrizea), VideoCapture-ko fotograma ondo irakurri den ala ez adierazten duen balio boolearra itzuliz.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(β€œUnable to read from the webcam”)    continue
     }
.
.
.
}

Orain markoa bistaratu behar duzu sortutako leihoan. Hurrengo fotogramara pasatzeko etenaldia 50 ms-koa da.

leihoa.IMShow(img)
leihoa.WaitKey(50)

Aplikazioa abiarazi ondoren, kameratik bideo-korronte bat duen leiho bat irekiko da.

Golang eta OpenCV-n oinarritutako aurpegiak ezagutzeko sistema eraikitzea

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)
}
}

Adibidez 2

Adibide honetan, erabil dezagun aurreko adibidea eta eraiki dezagun Haar Cascades-en oinarritutako aurpegiak ezagutzeko sistema bat.

Haar kaskadak Haar wavelet teknika erabiliz entrenatzen diren kaska-sailkatzaileak dira. Irudi bateko pixelak aztertzen dituzte ezaugarri jakin batzuk detektatzeko. Haar Cascades-i buruz gehiago jakiteko, jarraitu beheko estekak.

Viola-Jones objektuak detektatzeko esparrua
Kaskadako sailkatzaileak
Haar antzeko ezaugarria

Deskargatu dagoeneko trebatutako kaskadak hemen egon daiteke. Oraingo adibidean, kaskadak erabiliko dira pertsona baten aurpegia aurrealdetik identifikatzeko.

Horretarako, sailkatzaile bat sortu eta lehendik trebatutako fitxategi bat elikatu behar duzu (esteka goian ematen da). Pencv_haarcascade_frontalface_default.xml fitxategia gure programa dagoen direktoriora igo dut dagoeneko.

harrcascade := β€œopencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Irudi batean aurpegiak detektatzeko, metodoa erabili behar duzu DetectMultiScale. Funtzio honek kameraren bideo-korrontetik irakurri berri den fotograma (Mat mota) hartzen du eta Laukizuzen motako array bat itzultzen du. Matrizearen tamainak sailkatzaileak markoan detektatu ahal izan dituen aurpegi kopurua adierazten du. Ondoren, zer aurkitu duen ikusten dugula ziurtatzeko, errepikatu dezagun laukizuzenen zerrendan eta inprima dezagun Rectangle objektua kontsolara, detektaturiko laukizuzenaren inguruan ertz bat sortuz. Hau Laukizuzen funtzioa erabiliz egin daiteke. Kamerak irakurritako Mat, DetectMultiScale metodoak itzuli duen Rectangle objektua, ertzaren kolorea eta lodiera onartuko ditu.

for _, r := range rects {
fmt.Println(β€œdetected”, r)
gocv.Rectangle(&img, r, color, 2)
}

Golang eta OpenCV-n oinarritutako aurpegiak ezagutzeko sistema eraikitzea

Golang eta OpenCV-n oinarritutako aurpegiak ezagutzeko sistema eraikitzea

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)
}
}

Eta... bai, dena atera zen! Orain Go-n idatzitako aurpegia ezagutzeko sistema sinple bat dugu. Laster esperimentu hauekin jarraitzeko eta gauza polit berriak sortzeko asmoa dut Go eta OpenCV konbinatuz.

Interesa baduzu, baloratu mesedez gRPC web zerbitzaria, Python eta OpenCV-en idatzi nuena. Aurpegi bat detektatzen den momentuan datuak transmititzen ditu. Hau da programazio-lengoaia ezberdinetan bezero desberdinak sortzeko oinarria. Zerbitzariarekin konektatu eta bertatik datuak irakurri ahal izango dituzte.

Eskerrik asko artikulua irakurtzeagatik!

Skillbox-ek gomendatzen du:

Iturria: www.habr.com

Gehitu iruzkin berria