您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# C++ OpenCV特征提取之如何实现HOG特征提取
## 一、HOG特征概述
方向梯度直方图(Histogram of Oriented Gradients, HOG)是一种在计算机视觉和图像处理中用于物体检测的特征描述方法。由Navneet Dalal和Bill Triggs在2005年提出,HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征向量,在行人检测等领域表现尤为突出。
### HOG的核心思想
1. **局部特征提取**:将图像分割为小的连通区域(cell)
2. **梯度方向统计**:计算每个cell内像素的梯度方向分布
3. **特征归一化**:对block内的cell进行对比度归一化
4. **组合特征向量**:将所有block的特征串联成最终特征
## 二、OpenCV中的HOG实现
OpenCV提供了完整的HOG特征计算API,主要包含以下关键类:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
// 创建HOG描述符
cv::HOGDescriptor hog(
cv::Size(64, 128), // 窗口大小
cv::Size(16, 16), // block大小
cv::Size(8, 8), // block步长
cv::Size(8, 8), // cell大小
9, // 直方图bin数
1, // L2-Hys归一化阈值
true, // gamma校正
cv::HOGDescriptor::DEFAULT_NLEVELS // 检测级别
);
cv::Mat src = cv::imread("image.jpg");
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
// 可选:直方图均衡化
cv::equalizeHist(gray, gray);
std::vector<float> descriptors;
std::vector<cv::Point> locations;
// 计算HOG特征
hog.compute(gray, descriptors, cv::Size(8,8), cv::Size(0,0), locations);
// 输出特征维度
std::cout << "Descriptor size: " << descriptors.size() << std::endl;
cv::Mat hogVisual;
hog.compute(gray, descriptors, cv::Size(8,8), cv::Size(0,0), locations, hogVisual);
// 归一化显示
normalize(hogVisual, hogVisual, 0, 255, cv::NORM_MINMAX);
hogVisual.convertTo(hogVisual, CV_8U);
// 创建SVM分类器
cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
svm->setType(cv::ml::SVM::C_SVC);
svm->setKernel(cv::ml::SVM::LINEAR);
// 训练数据准备
cv::Mat trainData, labels;
// ... 填充训练数据和标签 ...
// 训练SVM
svm->train(trainData, cv::ml::ROW_SAMPLE, labels);
// 预测
cv::Mat testDescriptor(1, descriptors.size(), CV_32FC1, descriptors.data());
float result = svm->predict(testDescriptor);
参数 | 典型值 | 影响 |
---|---|---|
窗口大小 | 64×128 | 检测目标的最小尺寸 |
block大小 | 16×16 | 局部特征区域 |
cell大小 | 8×8 | 梯度统计单元 |
bin数量 | 9 | 方向量化精度 |
L2阈值 | 0.2 | 归一化阈值 |
std::vector<cv::Rect> found;
hog.detectMultiScale(gray, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
hog.setNumThreads(4);
cv::cuda::HOGDescriptor cuda_hog;
// 加载预训练模型
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
// 执行检测
std::vector<cv::Rect> pedestrians;
hog.detectMultiScale(gray, pedestrians, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
// 绘制结果
for(const auto& rect : pedestrians) {
cv::rectangle(src, rect, cv::Scalar(0,255,0), 2);
}
特征维度爆炸
cv::PCA pca(descriptors, cv::Mat(), cv::PCA::DATA_AS_ROW, 0.95);
光照敏感问题
hog.setGammaCorrection(true);
误检率高
cv::groupRectangles(detections, 3, 0.2);
HOG特征作为一种经典的特征描述方法,在OpenCV中有着高效的实现。通过合理设置参数和结合机器学习分类器,可以在多种目标检测任务中获得良好效果。随着深度学习的发展,虽然CNN特征逐渐成为主流,但HOG仍在小样本和实时性要求高的场景中保持着实用价值。
注意:实际应用中建议结合具体场景调整参数,可通过交叉验证确定最优参数组合。完整代码示例可参考OpenCV官方文档。 “`
(全文约1150字,包含代码示例和技术细节)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。