Go - OpenCV 實現人臉識別

作者:掘金——吳佳浩 

https://juejin.cn/post/7259298176523141181

引言

OpenCV 是一個強大的計算機視覺庫,提供了豐富的圖像處理和計算機視覺算法。在 Mac 上安裝 OpenCV 可以通過 Homebrew 進行簡單快捷的安裝。一旦安裝完成,我們可以使用 Go 的 OpenCV 綁定庫來實現人臉識別等計算機視覺任務。

本文將向你介紹在 Mac 上安裝 OpenCV 的步驟,並演示如何使用 Go 的 OpenCV 綁定庫進行人臉識別。通過閱讀本文,你將瞭解如何配置 OpenCV 的環境並使用 Go 編程語言進行圖像處理和計算機視覺任務。

1、安裝 OpenCV 和 Go 的綁定庫

在 Mac 上安裝 OpenCV 可以使用 Homebrew 進行快速安裝,同時還需要手動下載 OpenCV 的 XML 分類器文件。我們可以通過設置環境變量 PKG_CONFIG_PATH 來配置 OpenCV 的環境。

在 Mac 上安裝 OpenCV

在 Mac 上安裝 OpenCV 可以使用 Homebrew 或手動編譯安裝。以下是使用 Homebrew 安裝 OpenCV 的步驟:

1.1 安裝 Homebrew:如果我們還沒有安裝 Homebrew,可以在終端中運行以下命令來安裝 Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

1.2 安裝 OpenCV:使用 Homebrew 安裝 OpenCV 非常簡單,只需要在終端中運行以下命令:

brew install opencv

1.3 配置 PKG_CONFIG_PATH 環境變量:安裝完成後,我們需要將 OpenCV 的安裝路徑添加到 PKG_CONFIG_PATH 環境變量中。運行以下命令將 OpenCV 的 pkgconfig 目錄添加到環境變量中:

export PKG_CONFIG_PATH="/usr/local/opt/opencv@4/lib/pkgconfig:$PKG_CONFIG_PATH"

請注意,上述命令假設我們使用的是 Homebrew 默認的安裝路徑。如果我們安裝 OpenCV 的位置不同,請相應地調整 PKG_CONFIG_PATH 的值。

1.4 驗證安裝:完成上述步驟後,我們可以通過運行以下命令來驗證 OpenCV 是否正確安裝:

pkg-config --cflags --libs opencv4

如果沒有報錯並且輸出包含了 OpenCV 的相關信息,則說明 OpenCV 已成功安裝並配置好了。

2. 使用 Go 進行人臉識別

在安裝 OpenCV 和 Go 的綁定庫後,我們可以使用 Go 編程語言來實現人臉識別。我們將演示如何加載人臉識別分類器文件,加載圖像,將圖像轉換爲灰度圖像,檢測人臉,並在圖像上繪製矩形框標記人臉。

  1. 安裝 OpenCV 和 Go 的綁定庫:
  1. 下載haarcascade_frontalface_default.xml文件:
  1. 在我們的 Golang 代碼中加載haarcascade_frontalface_default.xml文件:
  1. 使用 go mod 初始化一個項目目錄
.
├── go.mod
├── go.sum
├── haarcascade_frontalface_default.xml
└── main.go

5.main.go 文件編碼

在這段代碼中,我們首先導入了gocv.io/x/gocv包,該包是 Go 語言的 OpenCV 綁定庫。然後,我們使用opencv.LoadHaarClassifierCascade函數加載了人臉識別分類器文件 "haarcascade_frontalface_default.xml"。如果加載失敗,我們輸出錯誤信息並終止程序。

由於人臉識別分類器文件是用於檢測人臉的模型文件,所以在使用 OpenCV 進行人臉識別前,我們需要加載此文件。

  1. 通過以上的步驟,我們已經基本瞭解到一個實現的過程,下面是完整的 main.go 文件

完整代碼如下:

package main

import (
 "fmt"
 "gocv.io/x/gocv"
 "image/color"
)

func main() {
 // 步驟1:打開攝像頭設備
 webcam, err := gocv.VideoCaptureDevice(0)
 if err != nil {
  fmt.Println("打開攝像頭設備失敗:", err)
  return
 }
 defer webcam.Close()

 // 步驟2:加載人臉識別分類器
 classifier := gocv.NewCascadeClassifier()
 defer classifier.Close()

 if !classifier.Load("haarcascade_frontalface_default.xml") {
  fmt.Println("加載分類器文件失敗")
  return
 }

 // 步驟3:創建一個窗口用於顯示圖像
 window := gocv.NewWindow("Face Detection")
 defer window.Close()

 img := gocv.NewMat()
 defer img.Close()

 for {
  // 步驟4:從攝像頭讀取圖像幀
  if ok := webcam.Read(&img); !ok || img.Empty() {
   fmt.Println("無法從攝像頭讀取圖像幀")
   break
  }

  // 步驟5:將圖像轉換爲灰度圖像,因爲人臉識別通常在灰度圖像上進行
  gray := gocv.NewMat()
  defer gray.Close()

  gocv.CvtColor(img, &gray, gocv.ColorBGRToGray)

  // 步驟6:檢測人臉
  rects := classifier.DetectMultiScale(gray)
  fmt.Printf("檢測到 %d 個人臉\n", len(rects))

  // 步驟7:在圖像上繪製人臉邊界框
  for _, r := range rects {
   gocv.Rectangle(&img, r, color.RGBA{0, 255, 0, 0}, 2)
  }

  // 步驟8:顯示圖像
  window.IMShow(img)

  // 步驟9:等待用戶按下ESC鍵退出
  if window.WaitKey(1) == 27 {
   break
  }
 }
}

說明:

  1. 步驟 1:我們使用gocv.VideoCaptureDevice函數打開攝像頭設備,0表示使用默認的攝像頭。

  2. 步驟 2:我們使用gocv.NewCascadeClassifier函數創建一個人臉識別分類器,並使用classifier.Load方法加載haarcascade_frontalface_default.xml分類器文件。

  3. 步驟 3:我們使用gocv.NewWindow函數創建一個名爲 "Face Detection" 的窗口,用於顯示圖像。

  4. 步驟 4:我們使用webcam.Read方法從攝像頭讀取圖像幀,並檢查是否成功讀取圖像。

  5. 步驟 5:我們使用gocv.CvtColor函數將圖像轉換爲灰度圖像,因爲人臉識別通常在灰度圖像上進行。

  6. 步驟 6:我們使用classifier.DetectMultiScale方法檢測人臉,並得到人臉在圖像中的矩形區域。

  7. 步驟 7:我們使用gocv.Rectangle函數在圖像上繪製人臉邊界框,以便標記出人臉位置。

  8. 步驟 8:我們使用window.IMShow方法將標記後的圖像顯示在窗口中。

  9. 步驟 9:我們使用window.WaitKey方法等待用戶按下 ESC 鍵,如果按下 ESC 鍵則退出程序。

總結

以上代碼演示了使用 Go 語言的 OpenCV 綁定庫進行簡單的人臉識別任務。通過加載人臉識別分類器文件和圖像,將圖像轉換爲灰度圖像,並利用分類器檢測人臉,最後在原圖像上繪製矩形框標記人臉。人臉識別是計算機視覺領域的重要應用之一,可以應用於人臉識別登錄、人臉表情識別、人臉追蹤等場景。OpenCV 和 Go 的結合使得圖像處理和計算機視覺任務變得簡單而強大。希望本文對你在計算機視覺領域的學習和實踐有所幫助!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Vpjeu_JSvgvu6_ExiyKxTg