基於Golang和OpenCV建構人臉辨識系統

基於Golang和OpenCV建構人臉辨識系統
OpenCV 是一個專為電腦視覺專案設計的函式庫。 她已經20歲左右了。 我在大學時使用過它,並且仍在我的 C++ 和 Python 專案中使用它,因為它對這些語言有很好的支援。

但當我開始學習和使用 Go 時,我開始對 OpenCV 是否可以用來處理這種語言感興趣。 當時已經有整合的例子和教學了,但我覺得太複雜了。 過了一會兒,我發現了 The Hybrid Group 團隊創建的一個包裝器。 在本文中,我將向您展示如何透過使用 Haar Cascades 開發簡單的人臉辨識系統來開始使用 GoCV。

技能箱推薦: 實踐課程 《從零開始的Python開發》.

提醒: 對於“Habr”的所有讀者 - 使用“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 類型的 Read 方法。 它將期望一個 Mat 類型(我們上面建立的矩陣),傳回一個布林值,指示 VideoCapture 中的幀是否已成功讀取。

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

現在您需要在已建立的視窗中顯示框架。 移動到下一幀的暫停時間為 50 毫秒。

視窗.IMShow(img)
視窗.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 的更多信息,請點擊以下連結。

Viola-Jones 物件偵測框架
級聯分類器
類 Haar 特徵

下載已經訓練好的級聯 可以在這裡。 在當前範例中,級聯將用於從正面識別人臉。

為了做到這一點,您需要建立一個分類器並為其提供一個已經訓練過的檔案(上面給出了連結)。 我已經將pencv_haarcascade_frontalface_default.xml檔案上傳到我們程式所在的目錄中。

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

要偵測影像中的人臉,需要使用以下方法 檢測多尺度。 此函數採用剛從攝影機視訊串流讀取的影格(Mat 類型)並傳回 Rectangle 類型的陣列。 陣列大小表示分類器能夠在影格中偵測到的臉部數量。 然後,為了確保我們看到它找到的內容,讓我們迭代矩形列表並將 Rectangle 物件列印到控制台,在偵測到的矩形周圍建立邊框。 這可以使用矩形函數來完成。 它將接受相機讀取的 Mat、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 寫的。 它會在偵測到人臉時傳輸資料。 這是用不同程式語言創造不同客戶端的基礎。 他們將能夠連接到伺服器並從中讀取資料。

感謝您閱讀這篇文章!

技能箱推薦:

來源: www.habr.com

添加評論