OpenCV یک کتابخانه طراحی شده برای پروژه های بینایی کامپیوتری است. او در حال حاضر حدود 20 سال دارد. من از آن در کالج استفاده کردم و هنوز هم برای پروژه های ++C و پایتون از آن استفاده می کنم زیرا پشتیبانی خوبی از آن زبان ها دارد.
اما زمانی که شروع به یادگیری و استفاده از Go کردم، به این موضوع علاقه مند شدم که آیا می توان از OpenCV برای کار با این زبان استفاده کرد یا خیر. در آن زمان قبلاً نمونه ها و آموزش هایی در مورد ادغام وجود داشت، اما به نظرم خیلی پیچیده بود. کمی بعد با لفافی برخوردم که توسط تیم The Hybrid Group ساخته شده بود. در این مقاله، من به شما نشان خواهم داد که چگونه با توسعه یک سیستم تشخیص چهره ساده با Haar Cascades، با GoCV شروع کنید.
در مثال اول، ما سعی خواهیم کرد برنامهای ایجاد کنیم که پنجرهای را باز کند که جریان ویدیویی دوربین را نشان میدهد.
ابتدا باید کتابخانه های مورد نیاز برای کار را وارد کنید.
وارد كردن (
"ورود"
“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 انجام داد.
از آنجایی که ویدیو یک جریان پیوسته از فریمهای تصویر است، برای خواندن بیپایان جریان ویدیویی دوربین باید یک حلقه بینهایت ایجاد کنیم. برای این کار به متد Read از نوع VideoCapture نیاز دارید. انتظار می رود یک نوع Mat (ماتریسی که در بالا ایجاد کردیم)، یک مقدار بولی را برگرداند که نشان می دهد آیا فریم از VideoCapture با موفقیت خوانده شده است یا خیر.
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 بسازیم.
آبشار های هار طبقه بندی کننده های آبشاری هستند که با استفاده از تکنیک موجک هار آموزش داده می شوند. آنها پیکسل های یک تصویر را برای تشخیص ویژگی های خاص تجزیه و تحلیل می کنند. برای کسب اطلاعات بیشتر در مورد آبشار هار، لطفاً پیوندهای زیر را دنبال کنید.
آبشارهای آموزش دیده را بارگیری کنید می تواند اینجا باشد. در مثال فعلی، آبشارها برای شناسایی چهره افراد از جلو استفاده خواهند شد.
برای انجام این کار، باید یک طبقهبندی کننده ایجاد کنید و آن را با یک فایل آموزش دیده تغذیه کنید (لینک در بالا داده شده است). من قبلاً فایل pencv_haarcascade_frontalface_default.xml را در دایرکتوری که برنامه ما در آن قرار دارد آپلود کرده ام.
برای تشخیص چهره در یک تصویر، باید از این روش استفاده کنید DetectMultiScale. این تابع یک فریم (نوع Mat) را می گیرد که به تازگی از جریان ویدئوی دوربین خوانده شده است و آرایه ای از نوع Rectangle را برمی گرداند. اندازه آرایه نشاندهنده تعداد چهرههایی است که طبقهبندیکننده توانسته است در قاب تشخیص دهد. سپس، برای اطمینان از دیدن آنچه که پیدا کرده است، بیایید لیست مستطیل ها را تکرار کنیم و شی Rectangle را در کنسول چاپ کنیم، و یک حاشیه در اطراف مستطیل شناسایی شده ایجاد کنیم. این کار را می توان با استفاده از تابع Rectangle انجام داد. متد خوانده شده توسط دوربین، شی Rectangle که با روش DetectMultiScale برگردانده شده است، رنگ و ضخامت حاشیه را می پذیرد.
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 چیزهای جالب جدیدی ایجاد کنم.
اگر علاقه مند هستید، لطفا امتیاز دهید وب سرور gRPCکه در پایتون و OpenCV نوشتم. در لحظه شناسایی چهره، داده ها را به جریان می اندازد. این مبنای ایجاد کلاینت های مختلف در زبان های برنامه نویسی مختلف است. آنها قادر خواهند بود به سرور متصل شوند و داده ها را از آن بخوانند.