Изградња система за препознавање лица заснованог на Голангу и ОпенЦВ-у

Изградња система за препознавање лица заснованог на Голангу и ОпенЦВ-у
ОпенЦВ је библиотека дизајнирана за пројекте компјутерског вида. Она већ има око 20 година. Користио сам га на колеџу и још увек га користим за своје Ц++ и Питхон пројекте јер има добру подршку за те језике.

Али када сам почео да учим и користим Го, заинтересовао сам се да ли се ОпенЦВ може користити за рад са овим језиком. У то време су већ постојали примери и туторијали о интеграцији, али ми се чинило да су превише компликовани. Нешто касније, наишао сам на омот који је креирао тим Тхе Хибрид Гроуп. У овом чланку ћу вам показати како да почнете са ГоЦВ развојем једноставног система за препознавање лица са Хаар Цасцадес.

Скиллбок препоручује: Практични курс „Питхон програмер од нуле“.

Подсећамо: за све читаоце „Хабра“ – попуст од 10 рубаља при упису на било који курс Скиллбок користећи промотивни код „Хабр“.

Шта је потребно:

  • Иди;
  • ОпенЦВ (линкови за инсталацију испод);
  • веб или обична видео камера.

Инсталација

primer КСНУМКС

У првом примеру, покушаћемо да креирамо апликацију која отвара прозор који приказује видео стреам камере.

Прво морате да увезете библиотеке потребне за рад.

увоз (
"Пријава"
“гоцв.ио/к/гоцв”
)

Након тога, потребно је да креирате објекат ВидеоЦаптуре користећи функцију ВидеоЦаптуреДевице. Ово последње омогућава снимање видео тока помоћу камере. Функција користи цео број као параметар (представља ИД уређаја).

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

Сада пређимо на најзанимљивији део.

Пошто је видео непрекидан ток оквира слике, мораћемо да направимо бесконачну петљу да бисмо бесконачно читали видео ток камере. Да бисте то урадили, потребна вам је метода Реад типа ВидеоЦаптуре. Он ће очекивати Мат тип (матрица коју смо креирали изнад), враћајући логичку вредност која показује да ли је оквир из ВидеоЦаптуре-а успешно прочитан или не.

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

Сада морате да прикажете оквир у креираном прозору. Пауза за прелазак на следећи оквир је 50 мс.

виндов.ИМСхов(имг)
виндов.ВаитКеи(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)
}
}

primer КСНУМКС

У овом примеру, употребимо претходни пример и направимо систем за препознавање лица заснован на Хаар каскадама.

Хаар каскаде су каскадни класификатори који су обучени коришћењем Хаар таласне технике. Они анализирају пикселе на слици да би открили одређене карактеристике. Да бисте сазнали више о Хаар Цасцадес, пратите доле наведене везе.

Виола-Јонес оквир за откривање објеката
Каскадни класификатори
Карактеристика слична Хаару

Преузмите већ обучене каскаде могу бити овде. У тренутном примеру, каскаде ће се користити за идентификацију лица особе са предње стране.

Да бисте то урадили, потребно је да креирате класификатор и унесете га већ обученом датотеком (линк је дат изнад). Већ сам отпремио пенцв_хаарцасцаде_фронталфаце_дефаулт.кмл датотеку у директоријум где се налази наш програм.

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

И... да, све је успело! Сада имамо једноставан систем за препознавање лица написан у Го. Ускоро планирам да наставим ове експерименте и креирам нове цоол ствари комбиновањем Го и ОпенЦВ.

Ако сте заинтересовани, оцените гРПЦ веб сервер, који сам написао у Питхон-у и ОпенЦВ-у. Он емитује податке у тренутку када је лице откривено. Ово је основа за креирање различитих клијената у различитим програмским језицима. Они ће моћи да се повежу са сервером и читају податке са њега.

Хвала вам што сте прочитали чланак!

Скиллбок препоручује:

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster