OpenCV 是一個專為電腦視覺專案設計的函式庫。 她已經20歲左右了。 我在大學時使用過它,並且仍在我的 C++ 和 Python 專案中使用它,因為它對這些語言有很好的支援。
但當我開始學習和使用 Go 時,我開始對 OpenCV 是否可以用來處理這種語言感興趣。 當時已經有整合的例子和教學了,但我覺得太複雜了。 過了一會兒,我發現了 The Hybrid Group 團隊創建的一個包裝器。 在本文中,我將向您展示如何透過使用 Haar Cascades 開發簡單的人臉辨識系統來開始使用 GoCV。
技能箱推薦: 實踐課程
《從零開始的Python開發》 .提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。
需要什麼:
- 走;
- OpenCV(安裝程式連結如下);
- 網路或普通攝影機。
安裝
- Linux的:
gocv.io/入門/linux - 蘋果系統:
gocv.io/入門/macos - Windows上:
gocv.io/入門/Windows
例如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)
啟動應用程式後,將開啟一個包含來自攝影機的視訊串流的視窗。
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()
要偵測影像中的人臉,需要使用以下方法
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 來創造新的很酷的東西。
如果您有興趣,請評分
感謝您閱讀這篇文章!
技能箱推薦:
- 兩年實踐課程
“我是專業網頁開發人員” .- 教育在線課程
《職業Java開發人員》 .- 實踐年課程
《PHP 開發者從 0 到 PRO》 .
來源: www.habr.com