本文主要介紹下opencv中怎樣使用hog算法,因?yàn)樵趏pencv中已經(jīng)集成了hog這個類。其實(shí)使用起來是很簡單的,從后面的代碼就可以看出來。本文參考的資料為opencv自帶的sample。
關(guān)于opencv中hog的源碼分析,可以參考本人的另一篇博客:opencv源碼解析之(6):hog源碼分析
開發(fā)環(huán)境:opencv2.4.2+Qt4.8.2+ubuntu12.04+QtCreator2.5.
實(shí)驗(yàn)功能:
單擊Open Image按鈕,選擇需要進(jìn)行人檢測的一張圖片,確定后自動顯示出來。該圖片的大小沒限制。
單擊People Detect按鈕,則程序會自動對該圖片進(jìn)行行人檢測,且將檢測到的效果顯示出來,即用1個矩形框?qū)⑿腥丝虺鰜怼?/p>
單擊Close按鈕,退出程序。
實(shí)驗(yàn)說明:
1. hog描述子在opencv中為HOGDescriptor。
2.可以調(diào)用該描述子setSVMDetector方法給用于對hog特征進(jìn)行分類的svm模型的系數(shù)賦值,這里的參數(shù)為HOGDescriptor::getDefaultPeopleDetector()時表示采用系統(tǒng)默認(rèn)的參數(shù),因?yàn)檫@些參數(shù)是用很多圖片訓(xùn)練而來的。
3.對輸入圖片進(jìn)行行人檢測時由于圖片的大小不一樣,所以要用到多尺度檢測。這里是用hog類的方法detectMultiScale。參數(shù)解釋如下:
HOGDescriptor::detectMultiScale(const GpuMat&img, vector&found_locations, doublehit_threshold=0, Sizewin_stride=Size(), Sizepadding=Size(), doublescale0=1.05, intgroup_threshold=2)
該函數(shù)表示對輸入的圖片img進(jìn)行多尺度行人檢測img為輸入待檢測的圖片;found_locations為檢測到目標(biāo)區(qū)域列表;參數(shù)3為程序內(nèi)部計算為行人目標(biāo)的閾值,也就是檢測到的特征到SVM分類超平面的距離;參數(shù)4為滑動窗口每次移動的距離。它必須是塊移動的整數(shù)倍;參數(shù)5為圖像擴(kuò)充的大??;參數(shù)6為比例系數(shù),即滑動窗口每次增加的比例;參數(shù)7為組閾值,即校正系數(shù),當(dāng)一個目標(biāo)被多個窗口檢測出來時,該參數(shù)此時就起了調(diào)節(jié)作用,為0時表示不起調(diào)節(jié)作用。
4.最后對檢測出來的目標(biāo)矩形框,要采用一些方法處理,比如說2個目標(biāo)框嵌套著,則選擇最外面的那個框。5.因?yàn)閔og檢測出的矩形框比實(shí)際人體框要稍微大些,所以需要對這些矩形框大小尺寸做一些調(diào)整。
實(shí)驗(yàn)結(jié)果:
圖片1效果:

圖片2效果:

圖片3效果:

圖片4效果:

實(shí)驗(yàn)主要部分代碼(附錄有工程code下載鏈接):
#include"dialog.h"#include"ui_dialog.h"#include#includeDialog::Dialog(QWidget*parent) :
QDialog(parent),
ui(newUi::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}voidDialog::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("");
}voidDialog::on_detectButton_clicked()
{
vectorfound, found_filtered;
cv::HOGDescriptor people_dectect_hog;//采用默認(rèn)的已經(jīng)訓(xùn)練好了的svm系數(shù)作為此次檢測的模型people_dectect_hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());//對輸入的圖片img進(jìn)行多尺度行人檢測//img為輸入待檢測的圖片;found為檢測到目標(biāo)區(qū)域列表;參數(shù)3為程序內(nèi)部計算為行人目標(biāo)的閾值,也就是檢測到的特征到SVM分類超平面的距離;//參數(shù)4為滑動窗口每次移動的距離。它必須是塊移動的整數(shù)倍;參數(shù)5為圖像擴(kuò)充的大??;參數(shù)6為比例系數(shù),即測試圖片每次尺寸縮放增加的比例;//參數(shù)7為組閾值,即校正系數(shù),當(dāng)一個目標(biāo)被多個窗口檢測出來時,該參數(shù)此時就起了調(diào)節(jié)作用,為0時表示不起調(diào)節(jié)作用。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類型size_t i, j;for(i =0; i < found.size(); i++)
{
Rect r=found[i];//下面的這個for語句是找出所有沒有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的//話,則取外面最大的那個矩形框放入found_filtered中for(j =0; j
found_filtered.push_back(r);
}//在圖片img上畫出矩形框,因?yàn)閔og檢測出的矩形框比實(shí)際人體框要稍微大些,所以這里需要//做一些調(diào)整for(i =0; 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("");
}voidDialog::on_closeButton_clicked()
{
close();
}
實(shí)驗(yàn)總結(jié):從實(shí)驗(yàn)的結(jié)果來看,圖片檢測的準(zhǔn)確率一般,當(dāng)人體遮擋情況比較嚴(yán)重,且背景比較復(fù)雜時,有些誤檢和漏檢。不過程序的檢查速度還行,因?yàn)樵创a中用做了些優(yōu)化處理。