使用 Go 語言與 OpenCV 進行物體檢測

ttocr、com發表於2024-12-03

GoCV 是一個 Go 語言繫結的 OpenCV 庫,我們可以用它來處理影像、影片並進行物體檢測。透過 GoCV,我們能夠載入預訓練的 YOLO 模型,並在實時影片流中進行物體檢測。

環境準備

  1. 安裝 GoCV 庫
    首先,我們需要安裝 GoCV。GoCV 是 Go 語言的 OpenCV 繫結,可以透過以下命令安裝:

bash

安裝 GoCV

go get -u -d gocv.io/x/gocv
此外,我們還需要安裝 OpenCV 庫。具體的安裝方法可以參考 GoCV 的 官方安裝文件.

  1. 下載 YOLO 配置和權重檔案
    與其他語言類似,YOLO 模型需要配置檔案(.cfg)和權重檔案(.weights)。下載 YOLOv3 的配置檔案和權重檔案:

YOLOv3 配置檔案:yolov3.cfg
YOLOv3 權重檔案:yolov3.weights
程式碼實現
下面是用 Go 語言和 GoCV 實現物體檢測的程式碼。

go

package main

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

const (
CONFIDENCE_THRESHOLD = 0.5
NMS_THRESHOLD = 0.4
INPUT_WIDTH = 416
INPUT_HEIGHT = 416
)

func main() {
// 載入 YOLO 模型
net := gocv.ReadNet("yolov3.cfg", "yolov3.weights")
defer net.Close()

// 開啟攝像頭
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
	fmt.Println("錯誤: 無法開啟攝像頭!")
	return
}
defer webcam.Close()

// 建立視窗
window := gocv.NewWindow("物體檢測")
defer window.Close()

// 建立影像矩陣
img := gocv.NewMat()
defer img.Close()

// 影片流處理
for {
	if ok := webcam.Read(&img); !ok {
		fmt.Println("無法從攝像頭讀取影像")
		return
	}
	if img.Empty() {
		continue
	}

	// 建立 blob 進行輸入處理
	blob := gocv.BlobFromImage(img, 1.0/255.0, image.Pt(INPUT_WIDTH, INPUT_HEIGHT), gocv.NewScalar(0, 0, 0, 0), true, false)
	defer blob.Close()

	// 將輸入資料傳遞給模型
	net.SetInput(blob, "")

	// 獲取輸出層
	layerNames := net.GetLayerNames()
	outputLayer := net.GetUnconnectedOutLayersNames()

	// 執行前向推理
	outputs := net.Forward(outputLayer)

	// 進行後處理,提取物體框
	boxes, confidences, classIds := postprocess(img, outputs)

	// 對檢測框進行非最大抑制
	indices := gocv.NMSBoxes(boxes, confidences, CONFIDENCE_THRESHOLD, NMS_THRESHOLD)

	// 繪製檢測框和標籤
	for _, i := range indices {
		box := boxes[i]
		gocv.Rectangle(&img, box, gocv.NewScalar(0, 255, 0, 0), 2)
		label := fmt.Sprintf("Object: %.2f", confidences[i])
		gocv.PutText(&img, label, image.Pt(box.Min.X, box.Min.Y-10), gocv.FontHersheyPlain, 1.0, gocv.NewScalar(0, 255, 0, 0), 2)
	}

	// 顯示結果
	window.IMShow(img)
	if window.WaitKey(1) >= 0 {
		break
	}
}

}

// 後處理函式:提取物體框
func postprocess(frame gocv.Mat, outs []gocv.Mat) ([]image.Rectangle, []float32, []int) {
var boxes []image.Rectangle
var confidences []float32
var classIds []int

for _, out := range outs {
	data := out.DataPtr()
	for i := 0; i < out.Rows(); i++ {
		score := data[i*out.Cols():]
		confidence := score[5]
		if confidence > CONFIDENCE_THRESHOLD {
			centerX := int(score[0] * float32(frame.Cols()))
			centerY := int(score[1] * float32(frame.Rows()))
			width := int(score[2] * float32(frame.Cols()))
			height := int(score[3] * float32(frame.Rows()))
			box := image.Rect(centerX-width/2, centerY-height/2, centerX+width/2, centerY+height/2)

			boxes = append(boxes, box)
			confidences = append(confidences, confidence)
			classIds = append(classIds, int(score[4]))
		}
	}
}
return boxes, confidences, classIds

}
說明更多內容訪問ttocr.com或聯絡1436423940

  1. 程式碼解析
    載入 YOLO 模型:透過 gocv.ReadNet() 載入 YOLO 配置檔案和權重檔案。
    影片捕捉:使用 gocv.VideoCaptureDevice(0) 開啟攝像頭進行影片捕捉。
    影像預處理:使用 gocv.BlobFromImage() 函式將影像轉為適合 YOLO 模型輸入的格式。
    物體檢測:使用 net.Forward() 函式進行前向推理,得到檢測結果。
    後處理:透過 postprocess() 函式提取物體框、置信度和類別標籤,並繪製邊界框。
  2. 注意事項
    在使用 GoCV 時,確保已經正確安裝了 OpenCV 和 GoCV。
    YOLO 模型的配置檔案和權重檔案必須下載並放置在正確的路徑下。

相關文章