目標(biāo)檢測學(xué)習(xí)_1(用opencv自帶hog實(shí)現(xiàn)行人檢測)

本文主要介紹下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)化處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容