Голанг жана OpenCV негизинде жүзүн таануу системасын куруу

Голанг жана OpenCV негизинде жүзүн таануу системасын куруу
OpenCV бул компьютердик көрүү долбоорлору үчүн иштелип чыккан китепкана. Ал буга чейин 20 жашта. Мен аны колледжде колдондум жана дагы эле C++ жана Python долбоорлорумда колдоном, анткени ал тилдерге жакшы колдоо көрсөтөт.

Бирок мен Go үйрөнүп, колдоно баштаганда, мен OpenCV бул тил менен иштөө үчүн колдонулушу мүмкүнбү деген суроого кызыктым. Ал кезде интеграция боюнча мисалдар жана окуу куралдары бар болчу, бирок мага алар өтө татаалдай сезилди. Бир аздан кийин мен The Hybrid Group командасы тарабынан жасалган орогучка туш болдум. Бул макалада мен сизге Haar Cascades менен жүздү таануунун жөнөкөй системасын иштеп чыгуу менен GoCV менен кантип баштоону көрсөтөм.

Skillbox сунуштайт: Практикалык курс "Нөлдөн баштап Python иштеп чыгуучусу".

Биз эсиңизге салабыз: "Хабрдын" бардык окурмандары үчүн - "Habr" промо-кодун колдонуу менен каалаган Skillbox курсуна катталганда 10 000 рубль арзандатуу.

Эгер керек:

  • Баруу;
  • OpenCV (төмөндө орнотуучу шилтемелер);
  • желе же кадимки видео камера.

жөндөө

мисал 1

Биринчи мисалда биз камеранын видео агымын көрсөткөн терезени ачкан тиркемени түзүүгө аракет кылабыз.

Алгач жумушка керектүү китепканаларды импорттооңуз керек.

импорттоо (
"журнал"
"gocv.io/x/gocv"
)

Андан кийин, VideoCaptureDevice функциясын колдонуп VideoCapture объектин түзүшүңүз керек. Акыркысы камеранын жардамы менен видео агымды тартууга мүмкүндүк берет. Функция параметр катары бүтүн санды колдонот (ал түзмөктүн идентификаторун көрсөтөт).

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

Эми эң кызыктуу бөлүгүнө өтөбүз.

Видео сүрөт жээкчелеринин үзгүлтүксүз агымы болгондуктан, камеранын видео агымын чексиз окуу үчүн чексиз цикл түзүшүбүз керек болот. Бул үчүн, сизге VideoCapture түрүндөгү Read ыкмасы керек. Бул VideoCapture кадрынын ийгиликтүү окулгандыгын же окулбагандыгын көрсөтүүчү логикалык маанини кайтарып, Mat түрүн (жогоруда биз түзгөн матрица) күтөт.

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)

Тиркемени ишке киргизгенден кийин камерадан видео агымы бар терезе ачылат.

Голанг жана OpenCV негизинде жүзүн таануу системасын куруу

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 негизинде жүздү таануу системасын куралы.

Хаар каскаддары - Хаар толкун ыкмасын колдонуу менен үйрөтүлгөн каскаддык классификаторлор. Алар белгилүү бир өзгөчөлүктөрдү аныктоо үчүн сүрөттөлүштөгү пикселдерди талдайт. Хаар каскадтары жөнүндө көбүрөөк билүү үчүн, төмөнкү шилтемелерди аткарыңыз.

Виола-Джонс объектисин аныктоо негизи
Каскаддык классификаторлор
Хаар сыяктуу өзгөчөлүк

Буга чейин үйрөтүлгөн каскаддарды жүктөп алыңыз бул жерде. Учурдагы мисалда каскаддар адамдын жүзүн алдыңкы жагынан аныктоо үчүн колдонулат.

Бул үчүн, сиз классификатор түзүп, ага мурунтан эле үйрөтүлгөн файлды беришиңиз керек (шилтеме жогоруда берилген). Мен буга чейин pencv_haarcascade_frontalface_default.xml файлын биздин программа жайгашкан каталогго жүктөдүм.

harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Сүрөттөгү жүздөрдү аныктоо үчүн, сиз ыкманы колдонушуңуз керек DetectMultiScale. Бул функция камеранын видео агымынан жаңы эле окулган кадрды (мат түрү) алат жана Rectangle түрүндөгү массивди кайтарат. Массивдин өлчөмү классификатор кадрда аныктай алган жүздөрдүн санын билдирет. Андан кийин, анын эмне тапканын көрүү үчүн, келгиле, тик бурчтуктардын тизмесин кайталап көрөлү жана табылган тик бурчтуктун айланасында чек түзүп, Rectangle объектисин консолго басып чыгаралы. Бул Rectangle функциясын колдонуу менен жасалышы мүмкүн. Ал камера тарабынан окулган Matты, DetectMultiScale ыкмасы менен кайтарылган Rectangle объектисин, чектин түсүн жана калыңдыгын кабыл алат.

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

Голанг жана OpenCV негизинде жүзүн таануу системасын куруу

Голанг жана OpenCV негизинде жүзүн таануу системасын куруу

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

Жана... ооба, баары ойдогудай болду! Бизде азыр Go программасында жазылган жүздү таануунун жөнөкөй системасы бар. Жакында мен бул эксперименттерди улантууну жана Go менен OpenCVди айкалыштыруу менен жаңы сонун нерселерди түзүүнү пландап жатам.

Кызыксаңыз, баа бериңиз gRPC веб сервери, мен Python жана OpenCVде жазган. Ал жүз аныкталган учурда маалыматтарды агылып берет. Бул ар кандай программалоо тилдеринде ар кандай кардарларды түзүү үчүн негиз болуп саналат. Алар серверге туташып, андагы маалыматтарды окуй алышат.

Макаланы окуганыңыз үчүн рахмат!

Skillbox сунуштайт:

Source: www.habr.com

Комментарий кошуу