C++使用OpenCV進行物體識別與檢測的三種方法
1. OpenCV 環(huán)境配置回顧
在進行物體識別與檢測之前,需要先確保安裝并配置好 OpenCV 庫。如果你還沒有配置 OpenCV,可以參考以下步驟:
安裝 OpenCV:你可以通過官網(wǎng)下載安裝包,或者使用
vcpkg或conan等包管理工具來安裝 OpenCV。配置 IDE:確保 IDE(如 Visual Studio 或 CLion)正確設置了 OpenCV 的路徑,包含頭文件路徑和庫文件路徑。
2. Haar 特征分類器
Haar 特征分類器是一種基于機器學習的物體檢測方法,最早用于人臉檢測。OpenCV 提供了預訓練的 Haar 分類器模型,可以快速進行人臉、眼睛、行人等物體的檢測。
人臉檢測
OpenCV 提供了多個預訓練的分類器,如 haarcascade_frontalface_default.xml 用于人臉檢測。我們可以直接加載這個分類器進行人臉檢測。
#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);
// 加載預訓練的人臉分類器
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);
// 繪制矩形框標記人臉
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()方法用于加載預訓練的 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)進行行人檢測。
行人檢測
#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()方法用來進行行人檢測。getDefaultPeopleDetector()是一個預訓練的行人檢測器。
4. 基于深度學習的物體檢測
除了傳統(tǒng)的機器學習方法,基于深度學習的物體檢測已經(jīng)成為主流。OpenCV 支持通過深度學習框架(如 Caffe、TensorFlow、ONNX)加載并使用預訓練的深度學習模型進行物體檢測。
使用預訓練模型進行物體檢測
以 YOLO(You Only Look Once)為例,YOLO 是一個非常流行的實時物體檢測模型,它能夠同時檢測圖像中的多個物體并返回類別與位置。OpenCV 支持加載和使用 YOLO 模型進行物體檢測。
下載 YOLO 模型:
下載 YOLOv3 權(quán)重文件(
yolov3.weights)和配置文件(yolov3.cfg)。下載 COCO 類別文件(
coco.names)。
使用 YOLO 模型進行物體檢測:
#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);
// 設置網(wǎng)絡輸入
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++) {
// 提取檢測框信息(置信度、類標簽、邊界框)
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 進行物體識別與檢測。我們覆蓋了以下幾種常見的方法:
Haar 特征分類器:用于人臉、眼睛等物體檢測,適合實時檢測任務。
HOG 特征與行人檢測:利用 HOG 特征結(jié)合 SVM 進行行人檢測。
基于深度學習的物體檢測:使用 YOLO 等深度學習模型進行物體檢測,能夠識別多種物體并返回其類別和位置。
這些方法適用于不同的應用場景,可以根據(jù)具體需求選擇合適的算法和模型。在未來的開發(fā)中,物體檢測技術(shù)將繼續(xù)發(fā)揮重要作用,助力人工智能的進一步發(fā)展。
以上就是C++使用OpenCV進行物體識別與檢測的三種方法的詳細內(nèi)容,更多關(guān)于C++ OpenCV物體識別與檢測的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++動態(tài)規(guī)劃實現(xiàn)查找最長公共子序列
這篇文章主要介紹了C++動態(tài)規(guī)劃最長公共子序列,在動態(tài)規(guī)劃中,你要將某個指標最大化。在這個例子中,你要找出最長公共子序列2022-06-06
C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配的相關(guān)資料,需要的朋友可以參考下2017-05-05

