欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++使用OpenCV進(jìn)行物體識別與檢測的三種方法

 更新時間:2025年04月03日 08:46:02   作者:威哥說編程  
物體識別與檢測是計算機視覺中的核心任務(wù)之一,它被廣泛應(yīng)用于自動駕駛、安防監(jiān)控、圖像分析等領(lǐng)域,通過物體檢測技術(shù),計算機能夠從圖像中識別出特定的物體或目標(biāo),本文將介紹如何使用 C++ 和 OpenCV 庫進(jìn)行物體識別與檢測,需要的朋友可以參考下

1. OpenCV 環(huán)境配置回顧

在進(jìn)行物體識別與檢測之前,需要先確保安裝并配置好 OpenCV 庫。如果你還沒有配置 OpenCV,可以參考以下步驟:

  1. 安裝 OpenCV:你可以通過官網(wǎng)下載安裝包,或者使用 vcpkg 或 conan 等包管理工具來安裝 OpenCV。

  2. 配置 IDE:確保 IDE(如 Visual Studio 或 CLion)正確設(shè)置了 OpenCV 的路徑,包含頭文件路徑和庫文件路徑。

2. Haar 特征分類器

Haar 特征分類器是一種基于機器學(xué)習(xí)的物體檢測方法,最早用于人臉檢測。OpenCV 提供了預(yù)訓(xùn)練的 Haar 分類器模型,可以快速進(jìn)行人臉、眼睛、行人等物體的檢測。

人臉檢測

OpenCV 提供了多個預(yù)訓(xùn)練的分類器,如 haarcascade_frontalface_default.xml 用于人臉檢測。我們可以直接加載這個分類器進(jìn)行人臉檢測。

#include <opencv2/opencv.hpp>
using namespace cv;
 
int main() {
    // 讀取輸入圖像
    Mat image = imread("people.jpg");
 
    if (image.empty()) {
        std::cout << "Error loading image!" << std::endl;
        return -1;
    }
 
    // 將圖像轉(zhuǎn)換為灰度圖
    Mat grayImage;
    cvtColor(image, grayImage, COLOR_BGR2GRAY);
 
    // 加載預(yù)訓(xùn)練的人臉分類器
    CascadeClassifier faceCascade;
    if (!faceCascade.load("haarcascade_frontalface_default.xml")) {
        std::cout << "Error loading cascade file!" << std::endl;
        return -1;
    }
 
    // 檢測人臉
    std::vector<Rect> faces;
    faceCascade.detectMultiScale(grayImage, faces);
 
    // 繪制矩形框標(biāo)記人臉
    for (size_t i = 0; i < faces.size(); i++) {
        rectangle(image, faces[i], Scalar(0, 255, 0), 2);
    }
 
    // 顯示檢測結(jié)果
    imshow("Detected Faces", image);
    waitKey(0);
 
    return 0;
}
  • CascadeClassifier::load() 方法用于加載預(yù)訓(xùn)練的 Haar 分類器文件。

  • detectMultiScale() 方法用于檢測圖像中的人臉,返回值是一個 Rect 向量,包含檢測到的人臉矩形區(qū)域。

  • rectangle() 方法用來在圖像上繪制矩形框。

其他分類器

OpenCV 提供了多種 Haar 分類器,用于檢測眼睛、上半身、下半身等物體。例如:

CascadeClassifier eyeCascade;
eyeCascade.load("haarcascade_eye.xml");
eyeCascade.detectMultiScale(grayImage, eyes);

3. HOG 特征與行人檢測

HOG(Histogram of Oriented Gradients)特征是另一種常用于物體檢測的技術(shù),特別適用于行人檢測。OpenCV 中提供了一個 HOGDescriptor 類,用于提取 HOG 特征,并結(jié)合支持向量機(SVM)進(jìn)行行人檢測。

行人檢測

#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
using namespace cv;
 
int main() {
    // 讀取輸入圖像
    Mat image = imread("people.jpg");
 
    if (image.empty()) {
        std::cout << "Error loading image!" << std::endl;
        return -1;
    }
 
    // 創(chuàng)建 HOG 描述符
    HOGDescriptor hog;
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
 
    // 檢測圖像中的行人
    std::vector<Rect> foundLocations;
    hog.detectMultiScale(image, foundLocations);
 
    // 在圖像中繪制檢測到的行人位置
    for (size_t i = 0; i < foundLocations.size(); i++) {
        rectangle(image, foundLocations[i], Scalar(0, 255, 0), 2);
    }
 
    // 顯示檢測結(jié)果
    imshow("Detected People", image);
    waitKey(0);
 
    return 0;
}
  • HOGDescriptor 是用于提取 HOG 特征的 OpenCV 類,detectMultiScale() 方法用來進(jìn)行行人檢測。

  • getDefaultPeopleDetector() 是一個預(yù)訓(xùn)練的行人檢測器。

4. 基于深度學(xué)習(xí)的物體檢測

除了傳統(tǒng)的機器學(xué)習(xí)方法,基于深度學(xué)習(xí)的物體檢測已經(jīng)成為主流。OpenCV 支持通過深度學(xué)習(xí)框架(如 Caffe、TensorFlow、ONNX)加載并使用預(yù)訓(xùn)練的深度學(xué)習(xí)模型進(jìn)行物體檢測。

使用預(yù)訓(xùn)練模型進(jìn)行物體檢測

以 YOLO(You Only Look Once)為例,YOLO 是一個非常流行的實時物體檢測模型,它能夠同時檢測圖像中的多個物體并返回類別與位置。OpenCV 支持加載和使用 YOLO 模型進(jìn)行物體檢測。

  1. 下載 YOLO 模型

    • 下載 YOLOv3 權(quán)重文件(yolov3.weights)和配置文件(yolov3.cfg)。

    • 下載 COCO 類別文件(coco.names)。

  2. 使用 YOLO 模型進(jìn)行物體檢測

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
using namespace cv;
using namespace cv::dnn;
 
int main() {
    // 加載 YOLO 模型
    Net net = readNet("yolov3.weights", "yolov3.cfg");
    std::vector<String> outNames = net.getUnconnectedOutLayersNames();
 
    // 加載類別名稱
    std::ifstream ifs("coco.names");
    std::vector<std::string> classes;
    std::string line;
    while (getline(ifs, line)) {
        classes.push_back(line);
    }
 
    // 讀取輸入圖像
    Mat image = imread("image.jpg");
 
    // 轉(zhuǎn)換圖像為 YOLO 輸入格式
    Mat blob = blobFromImage(image, 1 / 255.0, Size(416, 416), Scalar(), true, false);
 
    // 設(shè)置網(wǎng)絡(luò)輸入
    net.setInput(blob);
 
    // 獲取 YOLO 輸出
    std::vector<Mat> outs;
    net.forward(outs, outNames);
 
    // 處理輸出
    for (size_t i = 0; i < outs.size(); i++) {
        Mat detectionMat = outs[i];
        for (int j = 0; j < detectionMat.rows; j++) {
            // 提取檢測框信息(置信度、類標(biāo)簽、邊界框)
            float confidence = detectionMat.at<float>(j, 4);
            if (confidence > 0.5) {  // 只顯示置信度大于 0.5 的檢測結(jié)果
                int classId = -1;
                float maxClassConf = -1;
                for (int k = 5; k < detectionMat.cols; k++) {
                    if (detectionMat.at<float>(j, k) > maxClassConf) {
                        maxClassConf = detectionMat.at<float>(j, k);
                        classId = k - 5;
                    }
                }
 
                // 計算邊界框
                int x = int(detectionMat.at<float>(j, 0) * image.cols);
                int y = int(detectionMat.at<float>(j, 1) * image.rows);
                int width = int(detectionMat.at<float>(j, 2) * image.cols);
                int height = int(detectionMat.at<float>(j, 3) * image.rows);
 
                // 繪制邊界框
                rectangle(image, Rect(x, y, width, height), Scalar(0, 255, 0), 2);
                putText(image, classes[classId], Point(x, y - 5), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2);
            }
        }
    }
 
    // 顯示檢測結(jié)果
    imshow("YOLO Object Detection", image);
    waitKey(0);
 
    return 0;
}
  • readNet() 方法加載 YOLO 模型的權(quán)重和配置文件。

  • blobFromImage() 方法將輸入圖像轉(zhuǎn)換為適合 YOLO 模型的輸入格式。

  • forward() 方法執(zhí)行前向推理,獲取檢測結(jié)果。

  • 根據(jù) YOLO 輸出的邊界框、置信度和類別信息,我們可以在圖像上繪制邊界框并顯示物體類別。

5. 總結(jié)

在本文中,我們介紹了如何使用 C++ 和 OpenCV 進(jìn)行物體識別與檢測。我們覆蓋了以下幾種常見的方法:

  • Haar 特征分類器:用于人臉、眼睛等物體檢測,適合實時檢測任務(wù)。

  • HOG 特征與行人檢測:利用 HOG 特征結(jié)合 SVM 進(jìn)行行人檢測。

  • 基于深度學(xué)習(xí)的物體檢測:使用 YOLO 等深度學(xué)習(xí)模型進(jìn)行物體檢測,能夠識別多種物體并返回其類別和位置。

這些方法適用于不同的應(yīng)用場景,可以根據(jù)具體需求選擇合適的算法和模型。在未來的開發(fā)中,物體檢測技術(shù)將繼續(xù)發(fā)揮重要作用,助力人工智能的進(jìn)一步發(fā)展。

以上就是C++使用OpenCV進(jìn)行物體識別與檢測的三種方法的詳細(xì)內(nèi)容,更多關(guān)于C++ OpenCV物體識別與檢測的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++動態(tài)規(guī)劃實現(xiàn)查找最長公共子序列

    C++動態(tài)規(guī)劃實現(xiàn)查找最長公共子序列

    這篇文章主要介紹了C++動態(tài)規(guī)劃最長公共子序列,在動態(tài)規(guī)劃中,你要將某個指標(biāo)最大化。在這個例子中,你要找出最長公共子序列
    2022-06-06
  • C++ Eigen庫實現(xiàn)最小二乘擬合的示例代碼

    C++ Eigen庫實現(xiàn)最小二乘擬合的示例代碼

    Eigen 是一個線性算術(shù)的 C++ 模板庫,功能強大、快速、優(yōu)雅以及支持多平臺,本文主要為大家介紹了C++利用Eigen庫實現(xiàn)最小二乘擬合的示例代碼,希望對大家有所幫助
    2023-07-07
  • C和C++中argc和argv的含義及用法詳解

    C和C++中argc和argv的含義及用法詳解

    argv 是 argument vector的縮寫,表示傳入main函數(shù)的參數(shù)序列或指針,這篇文章主要介紹了C和C++中argc和argv的含義以及用法,需要的朋友可以參考下
    2022-11-11
  • C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配

    C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++深入講解函數(shù)重載

    C++深入講解函數(shù)重載

    C++ 允許多個函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個函數(shù)名可以有多種用途
    2022-07-07
  • 重構(gòu)-C++實現(xiàn)矩陣的簡單實例

    重構(gòu)-C++實現(xiàn)矩陣的簡單實例

    下面小編就為大家?guī)硪黄貥?gòu)-C++實現(xiàn)矩陣的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 用QT實現(xiàn)計時器功能

    用QT實現(xiàn)計時器功能

    這篇文章主要為大家詳細(xì)介紹了用QT實現(xiàn)計時器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++廣播通信實例

    C++廣播通信實例

    這篇文章主要介紹了C++實現(xiàn)廣播通信的方法,實例講述了C++ socket廣播通信的原理與實現(xiàn)方法,需要的朋友可以參考下
    2014-10-10
  • C++四種cast使用詳細(xì)介紹

    C++四種cast使用詳細(xì)介紹

    本文主要介紹了C++四種cast使用詳細(xì)介紹,今天我們要來講的是顯式類型轉(zhuǎn)換,C++提供了四種顯式類型轉(zhuǎn)換,分別是:static_cast、dynamic_cast、const_cast、reinterpret_cast,感興趣的可以了解一下
    2022-07-07
  • C語言例題講解指針與數(shù)組

    C語言例題講解指針與數(shù)組

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-07-07

最新評論