Golang болон OpenCV дээр суурилсан царай таних системийг бий болгох

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

Гэхдээ би Go-г сурч, ашиглаж эхлэхэд OpenCV-ийг энэ хэлтэй ажиллахад ашиглаж болох уу гэж бодсон. Тэр үед интеграцийн тухай жишээ, заавар аль хэдийн байсан ч надад хэтэрхий төвөгтэй санагдсан. Хэсэг хугацааны дараа би The Hybrid группын бүтээсэн боодолтой таарлаа. Энэ нийтлэлд би Haar Cascades-тай нүүр таних энгийн системийг хөгжүүлснээр GoCV-ийг хэрхэн эхлүүлэхийг харуулах болно.

Skillbox зөвлөж байна: Практик курс "Эхнээс нь Python хөгжүүлэгч".

Бид танд сануулж байна: "Хабр" -ын бүх уншигчдад - "Habr" сурталчилгааны кодыг ашиглан Skillbox-ын аль ч курст бүртгүүлэхдээ 10 рублийн хөнгөлөлт.

Чамд юу хэрэгтэй вэ:

  • Явах;
  • OpenCV (доорх суулгагчийн холбоосууд);
  • вэб эсвэл ердийн камер.

тохиргоо

жишээ нь 1

Эхний жишээнд бид камерын видео урсгалтай цонхыг нээх програм үүсгэхийг хичээх болно.

Эхлээд та ажиллах шаардлагатай номын сангуудыг импортлох хэрэгтэй.

импортлох (
"лог"
“gocv.io/x/gocv”
)

Үүний дараа та VideoCaptureDevice функцийг ашиглан VideoCapture объект үүсгэх хэрэгтэй. Сүүлийнх нь камер ашиглан видео бичлэг хийх боломжтой болгодог. Функц нь бүхэл тоог параметр болгон авдаг (энэ нь төхөөрөмжийн 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()

Одоо хамгийн сонирхолтой хэсэг рүүгээ орцгооё.

Видео нь зургийн жаазуудын тасралтгүй урсгал учраас бид камерын видео урсгалыг эцэс төгсгөлгүй уншихын тулд хязгааргүй давталт үүсгэх шаардлагатай болно. Энэ нь VideoCapture төрлийн Унших аргыг шаарддаг. Энэ нь VideoCapture-ийн фрэймийг амжилттай уншсан эсвэл уншаагүй эсэхийг илтгэх логик буцаах Mat төрлийн (бидний дээр үүсгэсэн матриц) хүлээж байна.

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

Одоо бид үүсгэсэн цонхонд хүрээг харуулах хэрэгтэй. Дараагийн хүрээ рүү шилжихийн тулд түр зогсоо - 50 мс.

цонх.IMShow(img)
window.WaitKey(50)

Програмыг ажиллуулсны дараа камераас видео дамжуулалт бүхий цонх нээгдэнэ.

Golang болон 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 дээр суурилсан царай таних системийг бүтээцгээе.

Haar каскадууд нь Haar долгионы техник дээр тулгуурлан бэлтгэгдсэн шаталсан ангилагч юм. Тэд тодорхой шинж чанаруудыг хайхын тулд зураг дээрх пикселүүдийг шинжилдэг. Haar Cascades-ийн талаар илүү ихийг мэдэхийг хүсвэл доорх холбоосыг дагана уу.

Виола-Жонсын объект илрүүлэх хүрээ
Каскадын ангилагч
Хаартай төстэй шинж чанар

Аль хэдийн бэлтгэгдсэн каскадуудыг татаж аваарай энд байж болно. Одоогийн жишээнд каскадуудыг урд талд байгаа хүний ​​царайг тодорхойлоход ашиглах болно.

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

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

Зурган дээрх царайг илрүүлэхийн тулд та энэ аргыг ашиглах хэрэгтэй DetectMultiScale. Энэ функц нь камерын видео урсгалаас дөнгөж уншсан фреймийг (Mat төрлийн) авч, Rectangle төрлийн массивыг буцаана. Массивын хэмжээ нь ангилагчийн хүрээ дотор илрүүлж чадсан нүүрний тоог илэрхийлнэ. Дараа нь бид юу олсон эсэхийг шалгахын тулд тэгш өнцөгтүүдийн жагсаалтыг давтаж, Rectangle объектыг консол дээр хэвлэж, олсон тэгш өнцөгтийн эргэн тойронд хүрээ үүсгэцгээе. Үүнийг Rectangle функцийг ашиглан хийж болно. Энэ нь камерын уншсан дэвсгэр, DetectMultiScale аргаар буцаасан Rectangle объект, хүрээний өнгө, зузаан зэргийг авна.

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

Golang болон OpenCV дээр суурилсан царай таних системийг бий болгох

Golang болон 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 зөвлөж байна:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх