本文主要介紹下opencv中怎樣使用hog算法蹈胡,因為在opencv中已經(jīng)集成了hog這個類渊季。其實使用起來是很簡單的,從后面的代碼就可以看出來罚渐。本文參考的資料為opencv自帶的sample却汉。
關(guān)于opencv中hog的源碼分析,可以參考本人的另一篇博客:opencv源碼解析之(6):hog源碼分析
開發(fā)環(huán)境:opencv2.4.2+Qt4.8.2+ubuntu12.04+QtCreator2.5.
實驗功能:
單擊Open Image按鈕荷并,選擇需要進行人檢測的一張圖片合砂,確定后自動顯示出來。該圖片的大小沒限制源织。
單擊People Detect按鈕翩伪,則程序會自動對該圖片進行行人檢測,且將檢測到的效果顯示出來谈息,即用1個矩形框?qū)⑿腥丝虺鰜怼?/p>
單擊Close按鈕缘屹,退出程序。
實驗說明:
1. hog描述子在opencv中為HOGDescriptor侠仇。
2.可以調(diào)用該描述子setSVMDetector方法給用于對hog特征進行分類的svm模型的系數(shù)賦值轻姿,這里的參數(shù)為HOGDescriptor::getDefaultPeopleDetector()時表示采用系統(tǒng)默認(rèn)的參數(shù)犁珠,因為這些參數(shù)是用很多圖片訓(xùn)練而來的。
3.對輸入圖片進行行人檢測時由于圖片的大小不一樣互亮,所以要用到多尺度檢測犁享。這里是用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進行多尺度行人檢測img為輸入待檢測的圖片豹休;found_locations為檢測到目標(biāo)區(qū)域列表炊昆;參數(shù)3為程序內(nèi)部計算為行人目標(biāo)的閾值,也就是檢測到的特征到SVM分類超平面的距離;參數(shù)4為滑動窗口每次移動的距離威根。它必須是塊移動的整數(shù)倍窑眯;參數(shù)5為圖像擴充的大小医窿;參數(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.因為hog檢測出的矩形框比實際人體框要稍微大些,所以需要對這些矩形框大小尺寸做一些調(diào)整症歇。
實驗結(jié)果:
圖片1效果:
圖片2效果:
圖片3效果:
圖片4效果:
實驗主要部分代碼(附錄有工程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進行多尺度行人檢測//img為輸入待檢測的圖片郎笆;found為檢測到目標(biāo)區(qū)域列表;參數(shù)3為程序內(nèi)部計算為行人目標(biāo)的閾值忘晤,也就是檢測到的特征到SVM分類超平面的距離;//參數(shù)4為滑動窗口每次移動的距離宛蚓。它必須是塊移動的整數(shù)倍;參數(shù)5為圖像擴充的大猩杷凄吏;參數(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上畫出矩形框,因為hog檢測出的矩形框比實際人體框要稍微大些,所以這里需要//做一些調(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();
}
實驗總結(jié):從實驗的結(jié)果來看心俗,圖片檢測的準(zhǔn)確率一般,當(dāng)人體遮擋情況比較嚴(yán)重撬呢,且背景比較復(fù)雜時,有些誤檢和漏檢鞠呈。不過程序的檢查速度還行藐唠,因為源碼中用做了些優(yōu)化處理。