C++使用OpenCV進(jìn)行物體識(shí)別與檢測(cè)的三種方法
1. OpenCV 環(huán)境配置回顧
在進(jìn)行物體識(shí)別與檢測(cè)之前,需要先確保安裝并配置好 OpenCV 庫(kù)。如果你還沒(méi)有配置 OpenCV,可以參考以下步驟:
安裝 OpenCV:你可以通過(guò)官網(wǎng)下載安裝包,或者使用
vcpkg
或conan
等包管理工具來(lái)安裝 OpenCV。配置 IDE:確保 IDE(如 Visual Studio 或 CLion)正確設(shè)置了 OpenCV 的路徑,包含頭文件路徑和庫(kù)文件路徑。
2. Haar 特征分類器
Haar 特征分類器是一種基于機(jī)器學(xué)習(xí)的物體檢測(cè)方法,最早用于人臉檢測(cè)。OpenCV 提供了預(yù)訓(xùn)練的 Haar 分類器模型,可以快速進(jìn)行人臉、眼睛、行人等物體的檢測(cè)。
人臉檢測(cè)
OpenCV 提供了多個(gè)預(yù)訓(xùn)練的分類器,如 haarcascade_frontalface_default.xml
用于人臉檢測(cè)。我們可以直接加載這個(gè)分類器進(jìn)行人臉檢測(cè)。
#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)練的人臉?lè)诸惼? CascadeClassifier faceCascade; if (!faceCascade.load("haarcascade_frontalface_default.xml")) { std::cout << "Error loading cascade file!" << std::endl; return -1; } // 檢測(cè)人臉 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); } // 顯示檢測(cè)結(jié)果 imshow("Detected Faces", image); waitKey(0); return 0; }
CascadeClassifier::load()
方法用于加載預(yù)訓(xùn)練的 Haar 分類器文件。detectMultiScale()
方法用于檢測(cè)圖像中的人臉,返回值是一個(gè)Rect
向量,包含檢測(cè)到的人臉矩形區(qū)域。rectangle()
方法用來(lái)在圖像上繪制矩形框。
其他分類器
OpenCV 提供了多種 Haar 分類器,用于檢測(cè)眼睛、上半身、下半身等物體。例如:
CascadeClassifier eyeCascade; eyeCascade.load("haarcascade_eye.xml"); eyeCascade.detectMultiScale(grayImage, eyes);
3. HOG 特征與行人檢測(cè)
HOG(Histogram of Oriented Gradients)特征是另一種常用于物體檢測(cè)的技術(shù),特別適用于行人檢測(cè)。OpenCV 中提供了一個(gè) HOGDescriptor
類,用于提取 HOG 特征,并結(jié)合支持向量機(jī)(SVM)進(jìn)行行人檢測(cè)。
行人檢測(cè)
#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()); // 檢測(cè)圖像中的行人 std::vector<Rect> foundLocations; hog.detectMultiScale(image, foundLocations); // 在圖像中繪制檢測(cè)到的行人位置 for (size_t i = 0; i < foundLocations.size(); i++) { rectangle(image, foundLocations[i], Scalar(0, 255, 0), 2); } // 顯示檢測(cè)結(jié)果 imshow("Detected People", image); waitKey(0); return 0; }
HOGDescriptor
是用于提取 HOG 特征的 OpenCV 類,detectMultiScale()
方法用來(lái)進(jìn)行行人檢測(cè)。getDefaultPeopleDetector()
是一個(gè)預(yù)訓(xùn)練的行人檢測(cè)器。
4. 基于深度學(xué)習(xí)的物體檢測(cè)
除了傳統(tǒng)的機(jī)器學(xué)習(xí)方法,基于深度學(xué)習(xí)的物體檢測(cè)已經(jīng)成為主流。OpenCV 支持通過(guò)深度學(xué)習(xí)框架(如 Caffe、TensorFlow、ONNX)加載并使用預(yù)訓(xùn)練的深度學(xué)習(xí)模型進(jìn)行物體檢測(cè)。
使用預(yù)訓(xùn)練模型進(jìn)行物體檢測(cè)
以 YOLO
(You Only Look Once)為例,YOLO 是一個(gè)非常流行的實(shí)時(shí)物體檢測(cè)模型,它能夠同時(shí)檢測(cè)圖像中的多個(gè)物體并返回類別與位置。OpenCV 支持加載和使用 YOLO 模型進(jìn)行物體檢測(cè)。
下載 YOLO 模型:
下載 YOLOv3 權(quán)重文件(
yolov3.weights
)和配置文件(yolov3.cfg
)。下載 COCO 類別文件(
coco.names
)。
使用 YOLO 模型進(jìn)行物體檢測(cè):
#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++) { // 提取檢測(cè)框信息(置信度、類標(biāo)簽、邊界框) float confidence = detectionMat.at<float>(j, 4); if (confidence > 0.5) { // 只顯示置信度大于 0.5 的檢測(cè)結(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; } } // 計(jì)算邊界框 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); } } } // 顯示檢測(cè)結(jié)果 imshow("YOLO Object Detection", image); waitKey(0); return 0; }
readNet()
方法加載 YOLO 模型的權(quán)重和配置文件。blobFromImage()
方法將輸入圖像轉(zhuǎn)換為適合 YOLO 模型的輸入格式。forward()
方法執(zhí)行前向推理,獲取檢測(cè)結(jié)果。根據(jù) YOLO 輸出的邊界框、置信度和類別信息,我們可以在圖像上繪制邊界框并顯示物體類別。
5. 總結(jié)
在本文中,我們介紹了如何使用 C++ 和 OpenCV 進(jìn)行物體識(shí)別與檢測(cè)。我們覆蓋了以下幾種常見(jiàn)的方法:
Haar 特征分類器:用于人臉、眼睛等物體檢測(cè),適合實(shí)時(shí)檢測(cè)任務(wù)。
HOG 特征與行人檢測(cè):利用 HOG 特征結(jié)合 SVM 進(jìn)行行人檢測(cè)。
基于深度學(xué)習(xí)的物體檢測(cè):使用 YOLO 等深度學(xué)習(xí)模型進(jìn)行物體檢測(cè),能夠識(shí)別多種物體并返回其類別和位置。
這些方法適用于不同的應(yīng)用場(chǎng)景,可以根據(jù)具體需求選擇合適的算法和模型。在未來(lái)的開(kāi)發(fā)中,物體檢測(cè)技術(shù)將繼續(xù)發(fā)揮重要作用,助力人工智能的進(jìn)一步發(fā)展。
以上就是C++使用OpenCV進(jìn)行物體識(shí)別與檢測(cè)的三種方法的詳細(xì)內(nèi)容,更多關(guān)于C++ OpenCV物體識(shí)別與檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)查找最長(zhǎng)公共子序列
這篇文章主要介紹了C++動(dòng)態(tài)規(guī)劃最長(zhǎng)公共子序列,在動(dòng)態(tài)規(guī)劃中,你要將某個(gè)指標(biāo)最大化。在這個(gè)例子中,你要找出最長(zhǎng)公共子序列2022-06-06C++ Eigen庫(kù)實(shí)現(xiàn)最小二乘擬合的示例代碼
Eigen 是一個(gè)線性算術(shù)的 C++ 模板庫(kù),功能強(qiáng)大、快速、優(yōu)雅以及支持多平臺(tái),本文主要為大家介紹了C++利用Eigen庫(kù)實(shí)現(xiàn)最小二乘擬合的示例代碼,希望對(duì)大家有所幫助2023-07-07C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配的相關(guān)資料,需要的朋友可以參考下2017-05-05重構(gòu)-C++實(shí)現(xiàn)矩陣的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇重構(gòu)-C++實(shí)現(xiàn)矩陣的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06用QT實(shí)現(xiàn)計(jì)時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了用QT實(shí)現(xiàn)計(jì)時(shí)器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08