基于VS C++平台的OpenCV设置,实现简单的行人检测
2017-01-03 21:04
721 查看
最近对OpenCV产生兴趣,于是尝试着搭建平台环境,主要是VisualStudio 2010与OpenCV的环境设置,这里网上教程很多不仔细讲了。运行了行人检测的这个例子,感觉效果还不错。
OpenCV中提供了HOG的行人检测(pedestrain detection)类,利用OpenCV中默认的SVM参数进行HOG行人检测,默认参数是根据Dalal的方法训练的。
HOG多尺度检测函数说明:
void detectMultiScale(constGpuMat& img, vector<Rect>& found_locations, double hit_threshold= 0,
Sizewin_stride = Size(), Size padding = Size(), double scale0=1.05,intgroup_threshold=2 );
img:待检测的图像,支持CV_8UC1或CV_8UC4类型
found_locations:检测到的目标的包围框数组
hit_threshold:检测到的特征到SVM分类超平面的距离,一般是设为0,在分类器参数中指明。
win_stride:检测窗口每次移动的距离,必须是块移动的整数倍
padding:保持CPU接口兼容性的虚参数,必须是(0,0)。但网上下载的例子里是(32,32)
scale0:滑动窗口每次增加的比例
group_threshold:组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用, 为0时表示不起调节作用。
以下是网上的例子代码,可以运行,实现形式比较简单,作为入门学习吧:
#include <iostream>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("xr.jpg");
HOGDescriptor hog;//HOG特征检测器
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//设置SVM分类器为默认参数
vector<Rect> found, found_filtered;//矩形框数组
hog.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图像进行多尺度检测,检测窗口移动步长为(8,8)
cout<<"矩形个数:"<<found.size()<<endl;
//找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中
for(int i=0; i < found.size(); i++)
{
Rect r = found[i];
int j=0;
for(; j < found.size(); j++)
if(j != i && (r & found[j]) == r)
break;
if( j == found.size())
found_filtered.push_back(r);
}
cout<<"过滤后矩形的个数:"<<found_filtered.size()<<endl;
//画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整
for(int i=0; i<found_filtered.size(); i++)
{
b0a3
Rect r = found_filtered[i];
r.x += cvRound(r.width*0.1);
r.width = cvRound(r.width*0.8);
r.y += cvRound(r.height*0.07);
r.height = cvRound(r.height*0.8);
rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3);
}
imwrite("ImgProcessed.jpg",src);
namedWindow("src",0);
imshow("src",src);
waitKey();//注意:imshow之后一定要加waitKey,否则无法显示图像
system("pause");
}
工程设置,右键点击工程选择属性:
在VC++ 目录里选择包含目录与库目(注意顶栏:配置(C)处选“活动(Debug)”),分别填入一下路径(这里对应的是我的安装路径):
VC++目录:包含目录
E:\openCV\opencv\build\include\opencv2
E:\openCV\opencv\build\include\opencv
E:\openCV\opencv\build\include
库目录
E:\openCV\opencv\build\x86\vc10\lib
之后选择“链接器”下的“输入”,填入各个lib:
链接器 -〉 输入:
opencv_calib3d244d.lib
opencv_contrib244d.lib
opencv_core244d.lib
opencv_features2d244d.lib
opencv_flann244d.lib
opencv_gpu244d.lib
opencv_highgui244d.lib
opencv_imgproc244d.lib
opencv_legacy244d.lib
opencv_ml244d.lib
opencv_objdetect244d.lib
opencv_ts244d.lib
opencv_video244d.lib
之后可以运行调试了,行人检测的效果如下:
感觉要学的东西还很多,自己新的一年里需要戒骄戒躁,谢谢支持~!
OpenCV中提供了HOG的行人检测(pedestrain detection)类,利用OpenCV中默认的SVM参数进行HOG行人检测,默认参数是根据Dalal的方法训练的。
HOG多尺度检测函数说明:
void detectMultiScale(constGpuMat& img, vector<Rect>& found_locations, double hit_threshold= 0,
Sizewin_stride = Size(), Size padding = Size(), double scale0=1.05,intgroup_threshold=2 );
img:待检测的图像,支持CV_8UC1或CV_8UC4类型
found_locations:检测到的目标的包围框数组
hit_threshold:检测到的特征到SVM分类超平面的距离,一般是设为0,在分类器参数中指明。
win_stride:检测窗口每次移动的距离,必须是块移动的整数倍
padding:保持CPU接口兼容性的虚参数,必须是(0,0)。但网上下载的例子里是(32,32)
scale0:滑动窗口每次增加的比例
group_threshold:组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用, 为0时表示不起调节作用。
以下是网上的例子代码,可以运行,实现形式比较简单,作为入门学习吧:
#include <iostream>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("xr.jpg");
HOGDescriptor hog;//HOG特征检测器
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//设置SVM分类器为默认参数
vector<Rect> found, found_filtered;//矩形框数组
hog.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图像进行多尺度检测,检测窗口移动步长为(8,8)
cout<<"矩形个数:"<<found.size()<<endl;
//找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中
for(int i=0; i < found.size(); i++)
{
Rect r = found[i];
int j=0;
for(; j < found.size(); j++)
if(j != i && (r & found[j]) == r)
break;
if( j == found.size())
found_filtered.push_back(r);
}
cout<<"过滤后矩形的个数:"<<found_filtered.size()<<endl;
//画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整
for(int i=0; i<found_filtered.size(); i++)
{
b0a3
Rect r = found_filtered[i];
r.x += cvRound(r.width*0.1);
r.width = cvRound(r.width*0.8);
r.y += cvRound(r.height*0.07);
r.height = cvRound(r.height*0.8);
rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3);
}
imwrite("ImgProcessed.jpg",src);
namedWindow("src",0);
imshow("src",src);
waitKey();//注意:imshow之后一定要加waitKey,否则无法显示图像
system("pause");
}
工程设置,右键点击工程选择属性:
在VC++ 目录里选择包含目录与库目(注意顶栏:配置(C)处选“活动(Debug)”),分别填入一下路径(这里对应的是我的安装路径):
VC++目录:包含目录
E:\openCV\opencv\build\include\opencv2
E:\openCV\opencv\build\include\opencv
E:\openCV\opencv\build\include
库目录
E:\openCV\opencv\build\x86\vc10\lib
之后选择“链接器”下的“输入”,填入各个lib:
链接器 -〉 输入:
opencv_calib3d244d.lib
opencv_contrib244d.lib
opencv_core244d.lib
opencv_features2d244d.lib
opencv_flann244d.lib
opencv_gpu244d.lib
opencv_highgui244d.lib
opencv_imgproc244d.lib
opencv_legacy244d.lib
opencv_ml244d.lib
opencv_objdetect244d.lib
opencv_ts244d.lib
opencv_video244d.lib
之后可以运行调试了,行人检测的效果如下:
感觉要学的东西还很多,自己新的一年里需要戒骄戒躁,谢谢支持~!
相关文章推荐
- 基于白点检测的数码相机自动白平衡算法实现(Opencv+vs)
- 基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
- 基于OpenCV的人脸检测——C++和Python实现
- 基于android平台的视觉检测智能相机的实现-opencv4android的应用
- C++基于OpenCV实现实时监控和运动检测记录
- 一个简单基于LRU连接检测实现
- PHP关于检测用户是否登陆,以及设置拦截器(简单实现)
- 基于opencv人脸检测原理及实现
- 【Android安全研究笔记】基于行为模式的Android平台入侵检测系统的设计与实现
- 三分钟实现一个插件平台和一个插件——基于最简单的OSGi.NET插件框架
- 一个简单基于LRU连接检测实现
- Windows平台基于多进程的echo服务器简单实现
- 基于opencv的简单亮度校正功能实现
- [机器学习]基于OpenCV实现最简单的数字识别
- 目标检测学习_1(用opencv自带hog实现行人检测)
- mini2440平台上简单opencv程序的实现
- (学习笔记二)——基于opencv人脸检测原理及实现
- OpenCV 2.4+ C++ 行人检测
- 基于opencv人脸检测原理及实现
- [机器学习]基于OpenCV实现最简单的数字识别