OpenCV使用HOGDescriptor实现行人检测
一、概述
案例:使用HOGDescriptor实现行人检测
实现步骤:
1.载入图像
2.图像灰度化
3.实例化HOGDescriptor,并使用SVM检测器来检测行人
4.使用detectMultScale在不同的尺度空间上实现行人检测
5.将4中检测到的行人矩形框绘制出来,并输出最终结果
在多尺度空间检测的API介绍:
detectMultiScale(InputArray img, CV_OUT std::vector<Rect>& foundLocations, double hitThreshold = 0, Size winStride = Size(), Size padding = Size(), double scale = 1.05, double finalThreshold = 2.0, bool useMeanshiftGrouping = false)
img:输入的灰度图像
foundLocations:检测结果(行人外接矩形)
hitThreshold:特征与SVM分类平面之间距离的阈值。通常为0,应在检测器系数中指定(作为最后一个自由系数)
winStride:窗口步长
padding:填充
scale:检测窗口增加的比例系数
finalThreshold:最终阀值,默认2.0
useMeanshiftGrouping:分组算法,默认false,一般不用,因为速度较慢
ps:一般情况下detectMultiScale使用默认参数就行
二、代码示例
Mat src = imread(filePath); if(src.empty()){ qDebug()<<"图像为空"; return; } Mat gray; cvtColor(src,gray,COLOR_BGR2GRAY); //hog+svm实现行人检测 HOGDescriptor hog = HOGDescriptor(); hog.setSVMDetector(hog.getDefaultPeopleDetector());//使用hog svm实现行人检测 //多尺度空间检测 vector<Rect> foundLocations;//检测到行人的矩形区域 hog.detectMultiScale(src,foundLocations);//后面的参数使用默认就行,这是opencv的经验值 // hog.detectMultiScale(src, foundLocations, 0, Size(1, 1), Size(8, 8), 1.05, 2); //将行人矩形框绘制出来 Mat result = src.clone(); for(size_t i =0;i<foundLocations.size();i++){ rectangle(result,foundLocations[i],Scalar(0,0,255),2,8,0); } imshow("result",result); pixmap = imageutils::matToQPixmap(result); label->setPixmap(pixmap.scaled(this->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
三、图片演示