使用 Golang-OpenCV 獲取攝像頭視頻流: 從原理到實踐

在現代計算機視覺應用中,實時視頻處理是一個重要的功能,例如監控系統、人臉識別、手勢檢測等。而 Go 語言結合 OpenCV 可以高效地實現攝像頭數據的採集和處理。在本篇文章將會簡單的講解,OpenCV 處理視頻流的基本步驟,原理和如何使用 gocv 這個庫來讀取攝像頭畫面。

安裝 OpenCV

因爲我用的是 mac 電腦所以,我使用 homebrew 進行 opencv 的安裝,其他平臺例如 archlinux 可以使用 pacman 命令進行安裝,因爲本人其他筆記本是 Linux 類型的操作系統,所以 windows 下的環境就不演示了。

brew install opencv
sudo pacman -S opencv # archlinux下運行此命令

因爲使用 opencv 時需要用 pkgconfig,所以我們還得安裝 pkgconfig,它主要用於確定編譯和鏈接 OpenCV。

brew install pkgconfig
sudo pacman -S base-devel pkg-config# archlinux下運行此命令

設置環境變量

在安裝好 opencv 後我們還需設置對應的環境變量,操作如下

export CGO_CXXFLAGS="--std=c++11"
export PKG_CONFIG_PATH="$(brew --prefix opencv)/lib/pkgconfig"
export CGO_CPPFLAGS="$(pkg-config --cflags opencv4)"
export CGO_LDFLAGS="$(pkg-config --libs opencv4)"

⚠️注意: 上述爲 mac 下的配置,Linux 平臺的設置操作與上述類似,這裏就不貼出來了。

OpenCV 處理視頻流的基本步驟和原理

在 OpenCV 中,攝像頭的讀取是通過 VideoCapture 類來實現的,它的核心流程如下:

  1. 打開攝像頭:VideoCapture(0) 用於訪問默認的攝像頭(設備索引 0)。

  2. 循環讀取幀

  1. 顯示畫面:使用 imshow 在窗口中實時展示視頻流。

  2. 鍵盤監聽:如果按下 Esc 鍵(ASCII 碼 27),則退出循環,關閉攝像頭。

使用 Golang 獲取攝像頭實時視頻流

首先先創建一個 go 項目,具體操作如下:

mkdir webopencv
cd webopencv && go mod init webopencv
go get -u -d gocv.io/x/gocv

然後鍵入如下代碼:

package main
import (
	"fmt"
	"gocv.io/x/gocv"
)
func main() {
	// 打開筆記本攝像頭(0 是默認設備)
	webcam, err := gocv.OpenVideoCapture(0)
	if err != nil {
		fmt.Println("無法打開攝像頭:", err)
		return
	}
	defer webcam.Close()
	// 創建窗口
	window := gocv.NewWindow("實時監控")
	defer window.Close()
	// 創建 Mat 結構用於存儲攝像頭幀
	img := gocv.NewMat()
	defer img.Close()
	for {
		// 讀取攝像頭畫面
		if ok := webcam.Read(&img); !ok || img.Empty() {
			continue
		}
		// 顯示窗口
		window.IMShow(img)
		// 按下 `Esc` 退出
		if window.WaitKey(1) == 27 {
			break
		}
	}
}

編譯並運行

go build -v
./webopencv

⚠️注意: 由於作者本人的顏值太高,怕被 gay 惦記上,這裏就就不放運行後的最終效果了,不過運行代碼時你的終端需要有對應的權限。mac 下,打開設置 -> 隱私與安全性 -> 攝像頭 -> 勾選終端就可正常運行了。

結語

本文介紹瞭如何使用 Golang + OpenCV 進行攝像頭採集,並講解了獲取攝像頭處理基本步驟原理,提供了完整代碼實現,環境安裝和運行。希望本文能幫助你順利運行 Go 版本的實時視頻流系統

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