應用OpenCV檢測自定義目標

2021-08-04 17:11:17 字數 3415 閱讀 5657

1.opencv\build\x86\vc10\bin下的opencv_createsamples.exe

2.opencv\build\x86\vc10\bin下的opencv_traincascade.exe

訓練的演算法是adaboost級聯分類器。關於adaboost的演算法講解,這篇博文有不錯的講解:

opencv_traincascade提供了三種不同的特徵提取方式:haar,lbp,hog。在本次應用中,待檢測的目標如下圖藍色橢圓中所示:

整體的步驟流程如下:

1、 正負樣本的建立;

2、 利用樣本,訓練分類器;

3、 利用訓練好的分類器進行目標檢測。

訓練樣本分為正樣本和反樣本。正樣本是指待檢測的目標樣本(例如汽車,人臉,標誌物等),反例樣本指不包含正樣本的背景(需要注意的是,這些反例樣本盡量是出現正樣本場景中的背景),所有的樣本都被歸一化為同樣的尺寸大小(例如,20x20、20x30)。 在本次演示工程中,通過攝像頭在不同光照、不同旋轉角度下拍攝待檢測物體的**,然後對進行摳圖,得到正樣本。得到的樣本數量約為500~1000個。然後拍攝正樣本可能的背景畫面,得到負樣本數量約為1000~1500個。得到正樣本後,利用opencv函式庫中的createsamples.exe工具生成正樣本描述檔案。這個檔案是接下來訓練要用的,可以看做是正樣本特徵的第一步提取。關於opencv_createsamples.exe的執行命令引數,可以查詢此篇部落格:命令為:

opencv_createsamples.exe -info info.txt -vec vector.vec -num 700 -w 20 -h 30

訓練階段演算法採用了adaboost(自適應增強)演算法,這是一種級聯分類器的演算法,將多個效能較弱的分類器級聯,組合成一種效能強的分類器。它的自適應在於:前乙個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下乙個基本分類器。同時,在每一輪中加入乙個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數。opencv提供了開源的adaboost演算法庫,可以比較方便的呼叫;而對於應用,比較重要的一點是特徵的選取。通常,樣本可以用haar、hog、lbp等特徵描述,例如人臉,用haar效果比較好,而對於行人,用hog效果比較好。在應用時,應分析物體特徵,選擇較好的特徵提取演算法。opencv_traincascade命令為:

opencv_traincascade.exe -data data/cascade -vec data/vector.vec -bg negative/infofile.txt -numpos 600 -numneg 1000 -numstages 20 -featuretype lbp -mode all -w 20 -h 30 

值得注意的是其中的numpos引數,並非為createsamples階段採用的700,否則會報錯。建議為num的0.8~0.9。另外經過測試,對於featuretype引數,lbp比haar效果相差無幾,但訓練速度快了很多。

經過訓練可以得到分類器。測試訓練效果如圖所示,藍色橢圓框內為檢測到的物體:

最後,附上原始碼。

1)產生正樣本的原始碼。通過攝像頭採集影象,在影象中設定乙個矩形框並繪製在影象中,作為採集樣本的區域。按s鍵儲存樣本,並歸一化成20*30大小。

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/highgui/highgui.hpp"

#include #include using namespace cv;

using namespace std;

mat image;

bool selectobje

selection &= rect(0, 0, image.cols, image.rows);

}switch( event )

}int main( int argc, const char** argv )

namedwindow( "camshift demo",1 );

selection = rect(300,300,100,160);

mat frame, cp_roi;

bool paused = false;

int cnt = 0;

for(;;)

imshow( "camshift demo", image );

if( c == 27 )

break;

}return 0;

}

2)利用訓練好的分類器進行檢測的**:

#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include #include using namespace std;

using namespace cv;

/** function headers */

void detectanddisplay( mat frame );

/** global variables */

//-- note, either copy these two files from opencv/data/haarscascades to your current folder, or change these locations

string face_cascade_name = "cascade_lbp_stages20.xml";

cascadeclassifier face_cascade;

string window_name = "capture - face detection";

rng rng(12345);

/** * @function main

*/int main( void );

//-- 2. read the video stream

capture.open( 1 );

if( capture.isopened() )

else

int c = waitkey(10);

if( (char)c == 'c' )

}} return 0;

}/**

* @function detectanddisplay

*/void detectanddisplay( mat frame )

//-- show what you got

imshow( window_name, frame );

}

OpenCV 自定義harris檢測

關於harris角點檢測的原理以及matlab版本,請移步 小白初學,這裡採用opencv實現之,把自己遇到的疑問一一表述出來,以備後用。cv s u f c 第一種形式,返回特定尺寸與型別的零矩陣,比如 mat a mat zeros 3,3,cv 32fc1 第二種形式,程式中採用的方式,mat...

Yolo訓練自定義目標檢測

參考darknet darknet detect cfg yolov3.cfg yolov3.weights data dog.jpg 能執行說明檢測沒有問題通過labelimg工具標註。選用window conda安裝,步驟如下 git clonecd 到目錄 conda install pyqt...

opencv自定義角點 自定義角點檢測器

自定義角點檢測器是基於harris和shi tomasi角點檢測的 首先通過計算矩陣m來得出 1 2兩個特徵值,然後根據他們得到角點響應值 然後自己設定閾值實現實現計算出閾值得到有效響應值的角點位置 apicv cornereigenvalsandvecs inputarray src,output...