OpenCV物体检测全攻略:C++实现Haar、HOG与深度学习的三种方法

在C++中使用OpenCV进行物体识别与检测有多种方法,以下是三种常见的方法:

图片[1]_OpenCV物体检测全攻略:C++实现Haar、HOG与深度学习的三种方法_知途无界

1. Haar级联分类器(Haar Cascade Classifier)

Haar级联分类器是一种基于Haar特征的机器学习对象检测方法。OpenCV提供了预训练的Haar级联分类器用于检测人脸、眼睛等常见物体。

步骤

  • 加载预训练的Haar级联XML文件。
  • 将输入图像转换为灰度图(Haar级联通常在灰度图上工作)。
  • 使用CascadeClassifier::detectMultiScale函数检测物体。

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_default.xml")) {
std::cerr << "Error loading haarcascade_frontalface_default.xml" << std::endl;
return -1;
}
cv::Mat img = cv::imread("image.jpg");
if (img.empty()) {
std::cerr << "Error reading image" << std::endl;
return -1;
}
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray, gray);
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces);
for (size_t i = 0; i < faces.size(); i++) {
cv::rectangle(img, faces[i], cv::Scalar(255, 0, 0), 2);
}
cv::imshow("Detected Faces", img);
cv::waitKey(0);
return 0;
}
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    cv::CascadeClassifier face_cascade;
    if (!face_cascade.load("haarcascade_frontalface_default.xml")) {
        std::cerr << "Error loading haarcascade_frontalface_default.xml" << std::endl;
        return -1;
    }

    cv::Mat img = cv::imread("image.jpg");
    if (img.empty()) {
        std::cerr << "Error reading image" << std::endl;
        return -1;
    }

    cv::Mat gray;
    cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
    cv::equalizeHist(gray, gray);

    std::vector<cv::Rect> faces;
    face_cascade.detectMultiScale(gray, faces);

    for (size_t i = 0; i < faces.size(); i++) {
        cv::rectangle(img, faces[i], cv::Scalar(255, 0, 0), 2);
    }

    cv::imshow("Detected Faces", img);
    cv::waitKey(0);
    return 0;
}
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::CascadeClassifier face_cascade; if (!face_cascade.load("haarcascade_frontalface_default.xml")) { std::cerr << "Error loading haarcascade_frontalface_default.xml" << std::endl; return -1; } cv::Mat img = cv::imread("image.jpg"); if (img.empty()) { std::cerr << "Error reading image" << std::endl; return -1; } cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::equalizeHist(gray, gray); std::vector<cv::Rect> faces; face_cascade.detectMultiScale(gray, faces); for (size_t i = 0; i < faces.size(); i++) { cv::rectangle(img, faces[i], cv::Scalar(255, 0, 0), 2); } cv::imshow("Detected Faces", img); cv::waitKey(0); return 0; }

2. HOG描述符与线性SVM(Histogram of Oriented Gradients + SVM)

HOG(Histogram of Oriented Gradients)是一种特征描述符,结合线性SVM分类器,可以用于物体检测,特别是在行人检测中表现良好。

步骤

  • 计算图像的HOG描述符。
  • 使用预训练的SVM模型对HOG描述符进行分类。
  • OpenCV提供了HOGDescriptor类来实现这一功能。

注意: 相比Haar级联,这种方法通常需要更多的计算资源,但可能在某些情况下提供更高的准确性。

3. 深度学习模型(如YOLO、SSD、Faster R-CNN)

近年来,基于深度学习的物体检测模型(如YOLO、SSD、Faster R-CNN)在准确性和速度上均取得了显著进展。OpenCV的DNN模块支持加载和运行这些模型。

步骤

  • 使用OpenCV的DNN模块加载预训练的深度学习模型(如Caffe、TensorFlow、ONNX格式)。
  • 预处理输入图像(如调整大小、归一化)。
  • 进行前向传播以获取检测结果。
  • 解析检测结果并绘制边界框。

代码示例(伪代码,具体实现因模型而异)

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
int main() {
cv::dnn::Net net = cv::dnn::readNetFromONNX("model.onnx");
cv::Mat img = cv::imread("image.jpg");
// Preprocess image (resize, blobFromImage, etc.)
cv::Mat blob = cv::dnn::blobFromImage(img, 1.0/255.0, cv::Size(416, 416), cv::Scalar(), true, false);
net.setInput(blob);
cv::Mat detections = net.forward();
// Parse detections and draw bounding boxes
// (Implementation depends on the specific model output format)
cv::imshow("Detections", img);
cv::waitKey(0);
return 0;
}
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>

int main() {
    cv::dnn::Net net = cv::dnn::readNetFromONNX("model.onnx");

    cv::Mat img = cv::imread("image.jpg");
    // Preprocess image (resize, blobFromImage, etc.)
    cv::Mat blob = cv::dnn::blobFromImage(img, 1.0/255.0, cv::Size(416, 416), cv::Scalar(), true, false);

    net.setInput(blob);
    cv::Mat detections = net.forward();

    // Parse detections and draw bounding boxes
    // (Implementation depends on the specific model output format)

    cv::imshow("Detections", img);
    cv::waitKey(0);
    return 0;
}
#include <opencv2/opencv.hpp> #include <opencv2/dnn.hpp> #include <iostream> int main() { cv::dnn::Net net = cv::dnn::readNetFromONNX("model.onnx"); cv::Mat img = cv::imread("image.jpg"); // Preprocess image (resize, blobFromImage, etc.) cv::Mat blob = cv::dnn::blobFromImage(img, 1.0/255.0, cv::Size(416, 416), cv::Scalar(), true, false); net.setInput(blob); cv::Mat detections = net.forward(); // Parse detections and draw bounding boxes // (Implementation depends on the specific model output format) cv::imshow("Detections", img); cv::waitKey(0); return 0; }

总结

  • Haar级联:简单易用,适合快速原型设计,但准确性可能较低。
  • HOG + SVM:适用于特定任务(如行人检测),准确性较高,但计算复杂度也较高。
  • 深度学习模型:准确性高,适用于复杂场景,但需要更多的计算资源和预训练模型。

选择哪种方法取决于具体的应用需求、计算资源和准确性要求。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞68 分享
I can accept failure but I can’t accept not trying.
可以接受暂时的失败,但绝对不能接受未曾奋斗过的自己
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容