በጎላንግ እና በOpenCV ላይ የተመሰረተ የፊት ለይቶ ማወቂያ ስርዓት መገንባት

በጎላንግ እና በOpenCV ላይ የተመሰረተ የፊት ለይቶ ማወቂያ ስርዓት መገንባት
OpenCV ለኮምፒውተር እይታ ፕሮጀክቶች የተነደፈ ቤተ-መጽሐፍት ነው። እሷ ቀድሞውኑ 20 ዓመቷ ነው። በኮሌጅ ውስጥ ተጠቀምኩኝ እና አሁንም ለ C++ እና Python ፕሮጄክቶች እጠቀማለሁ ምክንያቱም ለእነዚያ ቋንቋዎች ጥሩ ድጋፍ አለው።

ነገር ግን Go መማር እና መጠቀም ስጀምር OpenCV ከዚህ ቋንቋ ጋር ለመስራት ይቻል እንደሆነ ለማወቅ ፍላጎት አደረብኝ። በዚያን ጊዜ ስለ ውህደት ምሳሌዎች እና አጋዥ ስልጠናዎች ነበሩ፣ ግን በጣም የተወሳሰቡ መሰለኝ። ትንሽ ቆይቶ፣ በሃይብሪድ ግሩፕ ቡድን የተፈጠረ መጠቅለያ አገኘሁ። በዚህ ጽሑፍ ውስጥ ከሃር ካስኬድስ ጋር ቀላል የፊት ለይቶ ማወቂያ ስርዓትን በማዘጋጀት በ GoCV እንዴት እንደሚጀመር አሳያችኋለሁ።

Skillbox ይመክራል፡ ተግባራዊ ኮርስ "Python ገንቢ ከባዶ".

እኛ እናስታውስዎታለን- ለሁሉም የ "ሀብር" አንባቢዎች - የ "Habr" የማስተዋወቂያ ኮድን በመጠቀም በማንኛውም የ Skillbox ኮርስ ውስጥ ሲመዘገቡ የ 10 ሩብልስ ቅናሽ.

ምን ይጠየቃል?

  • ሂድ;
  • OpenCV (ከታች ጫኚ አገናኞች);
  • ድር ወይም መደበኛ የቪዲዮ ካሜራ።

ቅንብር

ለምሳሌ 1

በመጀመሪያው ምሳሌ የካሜራ ቪዲዮ ዥረት የሚያሳይ መስኮት የሚከፍት መተግበሪያ ለመፍጠር እንሞክራለን።

በመጀመሪያ ለስራ የሚያስፈልጉትን ቤተ-መጻሕፍት ማስመጣት ያስፈልግዎታል።

ማስመጣት (
"ሎግ"
"gocv.io/x/gocv"
)

ከዚህ በኋላ የ VideoCaptureDevice ተግባርን በመጠቀም የቪድዮ ቀረጻ ነገር መፍጠር ያስፈልግዎታል። የኋለኛው ደግሞ ካሜራ በመጠቀም የቪዲዮ ዥረት ለመቅረጽ ያስችላል። ተግባሩ ኢንቲጀርን እንደ መለኪያ ይጠቀማል (የመሳሪያውን መታወቂያ ይወክላል)።

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

አሁን n-dimensional ማትሪክስ መፍጠር አለብን. ከካሜራ የተነበቡ ምስሎችን ያከማቻል።

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 ሚሴ ነው።

መስኮት.IMShow(img)
መስኮት.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 ላይ የተመሰረተ የፊት ለይቶ ማወቂያ ስርዓት እንገንባ።

Haar cascades የ Haar wavelet ቴክኒክን በመጠቀም የሰለጠኑ የካስኬድ ክላሲፋየሮች ናቸው። የተወሰኑ ባህሪያትን ለማግኘት በምስል ውስጥ ያሉትን ፒክስሎች ይመረምራሉ. ስለ Haar Cascades የበለጠ ለማወቅ እባክዎ ከታች ያሉትን ማገናኛዎች ይከተሉ።

ቫዮላ-ጆንስ የነገር ማወቂያ ማዕቀፍ
ክላሲፋየተሮችን መቅዳት
ሃር የሚመስል ባህሪ

አስቀድመው የሰለጠኑ ካስኬዶችን ያውርዱ እዚህ ሊሆን ይችላል. አሁን ባለው ምሳሌ፣ ካስኬድ የአንድን ሰው ፊት ከፊት ለመለየት ጥቅም ላይ ይውላል።

ይህንን ለማድረግ ክላሲፋየር መፍጠር እና ቀድሞውኑ የሰለጠነ ፋይልን መመገብ ያስፈልግዎታል (አገናኙ ከዚህ በላይ ተሰጥቷል)። አስቀድሜ pencv_haarcascade_frontalface_default.xml ፋይል ፕሮግራማችን ወደሚገኝበት ማውጫ ሰቅዬዋለሁ።

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

በምስሉ ውስጥ ፊቶችን ለመለየት, ዘዴውን መጠቀም ያስፈልግዎታል ብዙ ሚዛንን አግኝ. ይህ ተግባር ከካሜራው የቪዲዮ ዥረት ብቻ የተነበበ ፍሬም (አይነት ማት) ይወስዳል እና የአራት ማዕዘን አይነት ድርድር ይመልሳል። የድርድር መጠኑ ክላሲፋዩ በፍሬም ውስጥ ሊያገኛቸው የቻለውን የፊቶች ብዛት ይወክላል። ከዚያም ያገኘውን ማየታችንን ለማረጋገጥ የሬክታንግል ዝርዝሩን እንድገም እና አራት ማዕዘን ነገርን ወደ ኮንሶሉ ላይ በማተም በተገኘው ሬክታንግል ዙሪያ ድንበር እንፍጠር። ይህ የሬክታንግል ተግባርን በመጠቀም ሊከናወን ይችላል። በካሜራ የተነበበው ምንጣፍ፣ በDetectMultiScale ዘዴ የተመለሰውን አራት ማዕዘን ነገር፣ ለድንበሩ ቀለም እና ውፍረት ይቀበላል።

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 ይመክራል፡

ምንጭ: hab.com

አስተያየት ያክሉ