OpenCV adalah perpustakaan yang dirancang untuk proyek visi komputer. Umurnya sudah sekitar 20 tahun. Saya menggunakannya di perguruan tinggi dan masih menggunakannya untuk proyek saya di C ++ dan Python, karena memiliki dukungan yang baik untuk bahasa-bahasa ini.
Tetapi ketika saya mulai belajar dan menggunakan Go, saya bertanya-tanya apakah OpenCV dapat digunakan untuk bekerja dengan bahasa ini. Pada waktu itu, sudah ada contoh dan tutorial tentang integrasi, tetapi bagi saya itu terlalu rumit. Beberapa saat kemudian saya menemukan bungkus yang dibuat oleh tim The Hybrid Group. Pada artikel ini, saya akan menunjukkan kepada Anda bagaimana cara memulai GoCV dengan mengembangkan sistem pengenalan wajah sederhana dengan Haar Cascades.
Skillbox merekomendasikan: Pengembang Python dari awal tentu saja.
Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox menggunakan kode promo "Habr".
Apa yang dibutuhkan:- Pergi;
- OpenCV (tautan penginstal di bawah);
- web atau camcorder konvensional.
InstalasiContoh 1
Pada contoh pertama, kami akan mencoba membuat aplikasi yang membuka jendela dengan peragaan aliran video kamera.
Pertama, Anda perlu mengimpor perpustakaan yang Anda perlu bekerja.
impor (
"Log"
“Gocv.io/x/gocv”
)Setelah itu, Anda perlu membuat objek VideoCapture menggunakan fungsi VideoCaptureDevice. Yang terakhir memungkinkan untuk menangkap aliran video menggunakan kamera. Fungsi menggunakan integer sebagai parameter (ini mewakili ID perangkat).
webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf(“error opening web cam: %v”, err) } defer webcam.Close()
Sekarang Anda perlu membuat matriks n-dimensi. Ini akan menyimpan gambar yang dibaca dari kamera.
img := gocv.NewMat() defer img.Close()
Untuk menampilkan aliran video, Anda perlu membuat jendela - ini dapat dilakukan menggunakan fungsi NewWindow.
window := gocv.NewWindow(“webcamwindow”) defer window.Close()
Sekarang mari kita beralih ke bagian yang paling menarik.
Karena video adalah aliran bingkai gambar yang berkelanjutan, kita perlu membuat lingkaran tanpa akhir untuk membaca aliran video kamera tanpa akhir. Untuk ini, diperlukan metode Baca tipe VideoCapture. Ini akan menunggu tipe Mat (matriks yang kami buat di atas), mengembalikan nilai boolean yang menunjukkan apakah frame dari VideoCapture berhasil dibaca atau tidak.
for { if ok := webcam.Read(&img); !ok || img.Empty( { log.Println(“Unable to read from the webcam”) continue } . . . }
Sekarang Anda perlu menampilkan bingkai di jendela yang dibuat. Jeda untuk pergi ke bingkai berikutnya - 50 ms.
window.IMShow (img)
window.WaitKey (50)Setelah memulai aplikasi, jendela dengan aliran video dari kamera akan terbuka.

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) } }
Contoh 2
Dalam contoh ini, mari kita mengambil keuntungan dari contoh sebelumnya dan membangun sistem pengenalan wajah berdasarkan Haar Cascades (Haar cascades).
Haar cascade adalah cascading classifier yang dilatih berdasarkan teknik wavelet Haar. Mereka menganalisis piksel dalam gambar untuk mendeteksi tanda-tanda tertentu. Untuk mempelajari lebih lanjut tentang Haar Cascades, ikuti tautan di bawah ini.
Kerangka deteksi objek Viola-jonesKlasifikasi CascadingFitur seperti HaarAnda
dapat mengunduh kaskade yang sudah terlatih di
sini . Dalam contoh saat ini, kaskade akan digunakan untuk mengidentifikasi wajah seseorang.
Untuk melakukan ini, Anda perlu membuat classifier dan memberinya file yang sudah terlatih (tautan di atas diberikan). Saya sudah mengunggah file pencv_haarcascade_frontalface_default.xml ke direktori tempat program kami berada.
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade) defer classifier.Close()
Untuk mendeteksi wajah dalam gambar, Anda perlu menggunakan metode
DetectMultiScale . Fungsi ini mengambil bingkai (tipe Mat) yang baru saja dibaca dari aliran video kamera dan mengembalikan array bertipe Rectangle. Ukuran array mewakili jumlah wajah yang dapat dideteksi oleh classifier dalam bingkai. Kemudian, untuk memastikan bahwa kita melihat apa yang dia temukan, mari kita lihat daftar persegi panjang dan menampilkan objek Rectangle di konsol, membuat perbatasan di sekitar persegi panjang yang terdeteksi. Ini dapat dilakukan dengan menggunakan fungsi Rectangle. Ini akan mengambil Mat dibaca oleh kamera, objek Rectangle yang dikembalikan oleh metode DetectMultiScale, warna dan ketebalan untuk perbatasan.
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) } }
Dan ... ya, itu berhasil! Sekarang kami memiliki sistem pengenalan wajah sederhana yang ditulis dalam Go. Dalam waktu dekat saya berencana untuk melanjutkan eksperimen ini dan membuat hal-hal keren baru, menggabungkan Go dan OpenCV.
Jika Anda tertarik, maka
periksa server web gRPC , yang saya tulis dengan Python dan OpenCV. Ini mengalirkan data pada saat deteksi wajah. Ini adalah dasar untuk menciptakan klien yang berbeda dalam bahasa pemrograman yang berbeda. Mereka akan dapat terhubung ke server dan membaca data darinya.
Terima kasih sudah membaca artikelnya!
Skillbox merekomendasikan: