
OpenCV - бұл компьютерлік көру жобаларына арналған кітапхана. Ол қазірдің өзінде 20 жаста. Мен оны колледжде қолдандым және оны әлі де C++ және Python жобаларым үшін қолданамын, өйткені ол тілдерге жақсы қолдау көрсетеді.
Бірақ мен Go үйреніп, қолдана бастағанда, мен OpenCV-ті осы тілмен жұмыс істеу үшін қолдануға бола ма деген сұрақ қызықтырды. Ол кезде интеграция бойынша мысалдар мен оқулықтар болды, бірақ маған олар тым күрделі болып көрінді. Біраз уақыттан кейін мен The Hybrid Group командасы жасаған қаптамаға тап болдым. Бұл мақалада мен Haar Cascades көмегімен бетті танудың қарапайым жүйесін жасау арқылы GoCV-ті қалай бастау керектігін көрсетемін.
Skillbox ұсынады: Практикалық курс .
Біз еске саламыз: «Хабрдың» барлық оқырмандары үшін - «Habr» жарнамалық кодын пайдаланып кез келген Skillbox курсына жазылу кезінде 10 000 рубль көлемінде жеңілдік.
Не қажет:
- Бару;
- OpenCV (төменде орнатушы сілтемелері);
- веб немесе кәдімгі бейне камера.
параметр
- Linux:
- macOS:
- Windows:
мысал 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)
Қолданбаны іске қосқаннан кейін камерадан бейне ағыны бар терезе ашылады.

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()Кескіндегі беттерді анықтау үшін әдісті пайдалану керек . Бұл функция камераның бейне ағынынан жаңа ғана оқылған кадрды (Mat түрі) алады және Rectangle түріндегі массивді қайтарады. Жиым өлшемі жіктеуіш кадрда анықтай алған беттердің санын көрсетеді. Содан кейін, оның не тапқанын көру үшін, тіктөртбұрыштар тізімін қайталап көрейік және анықталған тіктөртбұрыштың айналасында шекара жасай отырып, Rectangle нысанын консольге басып шығарайық. Мұны Rectangle функциясы арқылы жасауға болады. Ол камера оқитын төсенішін, DetectMultiScale әдісімен қайтарылған Rectangle нысанын, жиектің түсі мен қалыңдығын қабылдайды.
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)
}
}Және... иә, бәрі ойдағыдай болды! Бізде қазір Go бағдарламасында жазылған қарапайым бет-әлпетті тану жүйесі бар. Жақында мен бұл эксперименттерді жалғастырып, Go және OpenCV біріктіру арқылы жаңа керемет нәрселер жасауды жоспарлап отырмын.
Егер сізді қызықтырса, бағалаңыз , мен оны Python және OpenCV-де жаздым. Ол бет анықталған сәтте деректерді ағынмен жібереді. Бұл әртүрлі бағдарламалау тілдерінде әртүрлі клиенттерді құрудың негізі болып табылады. Олар серверге қосылып, одан деректерді оқи алады.
Мақаланы оқығаныңыз үшін рахмет!
Skillbox ұсынады:
- Екі жылдық практикалық курс .
- Білім беру онлайн курсы .
- Практикалық курс .
Ақпарат көзі: www.habr.com
