首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

目標偵測:HOG 特徵與 OpenCV 實作完整指南

     編輯:關於C++

HOG 特徵簡介

HOG(Histogram of Oriented Gradients,方向梯度直方圖)是電腦視覺中常用的特徵描述子,廣泛應用於行人偵測。它透過計算影像區域內梯度方向的分佈直方圖,捕捉物體的形狀與邊緣資訊。

OpenCV 內建 HOG 行人偵測器

OpenCV 提供 HOGDescriptor 類別,並內建已訓練好的人體偵測 SVM 分類器(getDefaultPeopleDetector()),可直接用於行人偵測,無需自行訓練模型。

完整程式碼範例

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char** argv) {
    // 讀取測試影像
    cv::Mat image = cv::imread("G:\\視頻分析入門練習\\視頻分析入門練習 - 附件\\testingdata for HOG\\frame_0061.jpg");
    if (image.empty()) {
        std::cout << "read image failed" << std::endl;
        return -1;
    }

    // 1. 建立 HOG 描述子(使用預設參數)
    cv::HOGDescriptor hog;

    // 2. 設定 SVM 分類器為預設行人偵測器
    hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());

    // 3. 執行多尺度偵測
    std::vector<cv::Rect> regions;
    hog.detectMultiScale(image, regions, 0, cv::Size(8, 8), cv::Size(32, 32), 1.05, 1);

    // 4. 繪製偵測結果
    for (size_t i = 0; i < regions.size(); i++) {
        cv::rectangle(image, regions[i], cv::Scalar(0, 0, 255), 2);
    }

    cv::imshow("HOG 行人偵測", image);
    cv::waitKey(0);
    return 0;
}

偵測結果展示

自訂訓練分類器說明

針對特定應用場景(如特定姿態、光照、遮擋),OpenCV 內建分類器可能效果不佳。此時需自行收集正負樣本,使用 HOGDescriptor::compute() 提取特徵,配合 SVM 訓練專屬分類器。相關訓練程式碼可參考:CSDN 下載連結。

自行訓練的分類器效果圖:

註:訓練樣本數量不足會導致分類器泛化能力差,建議收集足夠多樣的正負樣本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved