opencv怎么用分类器进行opencv 目标检测测

opencv新手,运动目标检测与追踪,求讲解!!!
[问题点数:40分,结帖人annila]
opencv新手,运动目标检测与追踪,求讲解!!!
[问题点数:40分,结帖人annila]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我相信世上无难事,只怕有心人!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1219)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084070',
blogTitle:'OpenCV学习笔记(二)基于Haar-like特征的层叠推进分类器快速目标检测',
blogAbstract:'一、简介目标检测方法最初由Paul Viola [Viola01]提出,并由Rainer Lienhart [Lienhart02]对这一方法进行了改善。该方法的基本步骤为: 首先,利用样本(大约几百幅样本图片)的 harr 特征进行分类器训练,得到一个级联的boosted分类器。分类器中的\"级联\"是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器, 这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。 为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:1,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我相信世上无难事,只怕有心人!',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}评论-2131&
trackbacks-0
  本文主要介绍下opencv中怎样使用hog算法,因为在opencv中已经集成了hog这个类。其实使用起来是很简单的,从后面的代码就可以看出来。本文参考的资料为opencv自带的sample。
&  关于opencv中hog的源码分析,可以参考本人的另一篇博客:
  开发环境:opencv2.4.2+Qt4.8.2+ubuntu12.04+QtCreator2.5.
  实验功能:
  单击Open
Image按钮,选择需要进行人检测的一张图片,确定后自动显示出来。该图片的大小没限制。
  单击People
Detect按钮,则程序会自动对该图片进行行人检测,且将检测到的效果显示出来,即用1个矩形框将行人框出来。
  单击Close按钮,退出程序。
  实验说明:
hog描述子在opencv中为HOGDescriptor。
可以调用该描述子setSVMDetector方法给用于对hog特征进行分类的svm模型的系数赋值,这里的参数为HOGDescriptor::getDefaultPeopleDetector()时表示采用系统默认的参数,因为这些参数是用很多图片训练而来的。  
  3. 对输入图片进行行人检测时由于图片的大小不一样,所以要用到多尺度检测。这里是用hog类的方法detectMultiScale。参数解释如下:
HOGDescriptor::detectMultiScale(const
GpuMat&&img,
vector&Rect&&&found_locations,
doublehit_threshold=0,
Size&win_stride=Size(),
Size&padding=Size(),
double&scale0=1.05,
int&group_threshold=2)
  该函数表示对输入的图片img进行多尺度行人检测&img为输入待检测的图片;found_locations为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离;参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即滑动窗口每次增加的比例;参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。
最后对检测出来的目标矩形框,要采用一些方法处理,比如说2个目标框嵌套着,则选择最外面的那个框。
因为hog检测出的矩形框比实际人体框要稍微大些,所以需要对这些矩形框大小尺寸做一些调整。
实验结果:
图片1效果:
图片2效果:
图片3效果:
图片4效果:
实验主要部分代码(附录有工程code下载链接):
#include "dialog.h"
#include "ui_dialog.h"
#include &QtCore&
#include &QtGui&
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
ui-&setupUi(this);
Dialog::~Dialog()
void Dialog::on_openButton_clicked()
QString img_mame = QFileDialog::getOpenFileName(this, "Open img", "../people", tr("Image Files(*.png *.jpg *.bmp *.jpeg)"));
img = imread( img_mame.toAscii().data() );
imwrite("../hog_test.jpg", img);
ui-&textBrowser-&setFixedSize(img.cols, img.rows);
ui-&textBrowser-&append("&img src=../hog_test.jpg&");
void Dialog::on_detectButton_clicked()
vector&Rect& found, found_
cv::HOGDescriptor people_dectect_
//采用默认的已经训练好了的svm系数作为此次检测的模型
people_dectect_hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
//对输入的图片img进行多尺度行人检测
//img为输入待检测的图片;found为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离;
//参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即测试图片每次尺寸缩放增加的比例;
//参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。
people_dectect_hog.detectMultiScale(img, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);
//从源码中可以看出:
//#define __SIZE_TYPE__ long unsigned int
//typedef __SIZE_TYPE__ size_t;
//因此,size_t是一个long unsigned int类型
for (i = 0; i & found.size(); i++ )
Rect r = found[i];
//下面的这个for语句是找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的
//话,则取外面最大的那个矩形框放入found_filtered中
for(j = 0; j &found.size(); j++)
if(j != i && (r&found[j])==r)
if(j == found.size())
found_filtered.push_back(r);
//在图片img上画出矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要
//做一些调整
for(i = 0; i &found_filtered.size(); i++)
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(img, r.tl(), r.br(), Scalar(0, 255, 0), 3);
imwrite("../hog_test_result.jpg", img);
ui-&textBrowser-&clear();
ui-&textBrowser-&append("&img src=../hog_test_result.jpg&");
void Dialog::on_closeButton_clicked()
实验总结:
从实验的结果来看,图片检测的准确率一般,当人体遮挡情况比较严重,且背景比较复杂时,有些误检和漏检。不过程序的检查速度还行,因为源码中用做了些优化处理。
阅读(...) 评论()
阿萨德发斯蒂芬OpenCV(91)
级联分类器
在这节教程中您将学到:
使用&&类来检测视频流中的物体.
特别地, 我们将使用函数:
&来加载一个
.xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.&来进行图像的多尺度检测.
本教程的代码如下所示. 你也可以&&下载.
第二个版本 (使用LBP进行人脸检测) 可以&&找到.
#include &opencv2/objdetect/objdetect.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &iostream&
#include &stdio.h&
using namespace std;
using namespace cv;
/** 函数声明 */
void detectAndDisplay( Mat frame );
/** 全局变量 */
string face_cascade_name = &haarcascade_frontalface_alt.xml&;
string eyes_cascade_name = &haarcascade_eye_tree_eyeglasses.xml&;
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
string window_name = &Capture - Face detection&;
RNG rng(12345);
/** @主函数 */
int main( int argc, const char** argv )
CvCapture* capture;
Mat frame;
//-- 1. 加载级联分类器文件
if( !face_cascade.load( face_cascade_name ) ){ printf(&--(!)Error loading\n&); return -1; };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf(&--(!)Error loading\n&); return -1; };
//-- 2. 打开内置摄像头视频流
capture = cvCaptureFromCAM( -1 );
if( capture )
while( true )
frame = cvQueryFrame( capture );
//-- 3. 对当前帧使用分类器进行检测
if( !frame.empty() )
{ detectAndDisplay( frame ); }
{ printf(& --(!) No captured frame -- Break!&); break; }
int c = waitKey(10);
if( (char)c == 'c' ) { break; }
/** @函数 detectAndDisplay */
void detectAndDisplay( Mat frame )
std::vector&Rect& faces;
Mat frame_gray;
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );
//-- 多尺寸检测人脸
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int i = 0; i & faces.size(); i++ )
Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
Mat faceROI = frame_gray( faces[i] );
std::vector&Rect& eyes;
//-- 在每张人脸上检测双眼
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int j = 0; j & eyes.size(); j++ )
Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
int radius = cvRound( (eyes[j].width + eyes[i].height)*0.25 );
circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
//-- 显示结果图像
imshow( window_name, frame );
下图就是使用上述代码对内置摄像头的视频流进行人脸检测的结果图像:
注意复制分类器文件&haarcascade_frontalface_alt.xml&和&haarcascade_eye_tree_eyeglasses.xml&到你的当前目录下. 他们在OpenCV安装文件夹&opencv/data/haarcascades&里面.
下图是使用分类器文件&lbpcascade_frontalface.xml&(LBP特征训练的) 进行的检测结果. 对于双眼的检测依旧使用刚才使用过的分类器.
from:&http://www./opencvdoc/2.3.2/html/doc/tutorials/objdetect/table_of_content_objdetect/table_of_content_objdetect.html#table-of-content-objdetect
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:515214次
积分:13338
积分:13338
排名:第627名
转载:244篇
(84)(159)(189)(317)(382)(479)(217)(348)(477)(286)(113)(8)(1)(72)(11)(10)(21)(11)
----------coding----------
----------MLCV----------
----------IT笔试面试----------
----------大数据云计算----------
----------Math----------Opencv中目标检测问题
[问题点数:10分]
Opencv中目标检测问题
[问题点数:10分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 opencv 分类器 的文章

 

随机推荐