opencv官方的svm**在
在看到一段還不錯的**,結構清楚,雖然注釋比較少,但很有參考價值,於是我新增了一些注釋,看著更舒服。廢話少說,直接上**:
#include "cv.h"
#include "highgui.h"
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
else
} }
svm_data.close();//關閉檔案
cvmat *data_mat, *res_mat;
int nimgnum = nline / 2; //讀入樣本數量 ,因為是每隔一行才是路徑,所以要除以2
樣本矩陣,nimgnum:橫座標是樣本數量, width * height:樣本特徵向量,即影象大小
data_mat = cvcreatemat( nimgnum, 1764, cv_32fc1 ); //這裡第二個引數,即矩陣的列是由下面的descriptors的大小決定的,可以由descriptors.size()得到,且對於不同大小的輸入訓練,這個值是不同的
cvsetzero( data_mat );
//型別矩陣,儲存每個樣本的型別標誌
res_mat = cvcreatemat( nimgnum, 1, cv_32fc1 );
cvsetzero( res_mat );
iplimage* src;
iplimage* trainimg=cvcreateimage(cvsize(64,64),8,3);//需要分析的,這裡預設設定是64*64大小,所以上面定義了1764,如果要更改大小,可以先用debug檢視一下descriptors是多少,然後設定好再執行
//開始搞hog特徵
for( string::size_type i = 0; i != img_path.size(); i++ )
//coutifstream img_tst( "e:/svm_test.txt" );//同輸入訓練樣本,這裡也是一樣的,只不過不需要標註屬於哪一類了
while( img_tst )
} img_tst.close();
cvmat *test_hog = cvcreatemat( 1, 1764, cv_32fc1 );//注意這裡的1764,同上面一樣
char line[512];
ofstream predict_txt( "svm_predict.txt" );//把**結果儲存在這個文字中
for( string::size_type j = 0; j != img_tst_path.size(); j++ )//依次遍歷所有的待檢測
int ret = svm.predict(svmtrainmat);//獲取最終檢測結果,這個predict的用法見 opencv的文件
std::sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );
predict_txt<
其中,關於hog函式hogdescriptor,見部落格
另外,自己需要把這個程式嵌入到另外乙個工程中去,因為那裡資料型別是mat,不是cvmat,所以我又修改了上面的程式,並且大小也不是固定的64*64,需要自己設定一下大小,因為太懶,直接把改好的程式放過來:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
else
} }
svm_data.close();//關閉檔案
mat data_mat, res_mat;
int nimgnum = nline; //讀入樣本數量
樣本矩陣,nimgnum:橫座標是樣本數量, width * height:樣本特徵向量,即影象大小
//data_mat = mat::zeros( nimgnum, 12996, cv_32fc1 );
//型別矩陣,儲存每個樣本的型別標誌
res_mat = mat::zeros( nimgnum, 1, cv_32fc1 );
mat src;
mat trainimg = mat::zeros(imgheight, imgwidht, cv_8uc3);//需要分析的
for( string::size_type i = 0; i != img_path.size(); i++ )
cout<<"hog dims: "<::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
//coutcout<<" end processing "<
/*
svm種類:cvsvm::c_svc
kernel的種類:cvsvm::rbf
degree:10.0(此次不使用)
gamma:8.0
coef0:1.0(此次不使用)
c:10.0
nu:0.5(此次不使用)
p:0.1(此次不使用)
然後對訓練資料正規化處理,並放在cvmat型的陣列裡。
*/
//☆☆☆☆☆☆☆☆☆(5)svm學習☆☆☆☆☆☆☆☆☆☆☆☆
svm.train( data_mat, res_mat, mat(), mat(), param );
//☆☆利用訓練資料和確定的學習引數,進行svm學習☆☆☆☆
//檢測樣本
vectorimg_tst_path;
while( img_tst )
} img_tst.close();
mat test;
char line[512];
for( string::size_type j = 0; j != img_tst_path.size(); j++ )
int ret = svm.predict(svmtrainmat);
std::sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );
printf("%s %d\r\n", img_tst_path[j].c_str(), ret);
getchar();
predict_txt<}
predict_txt.close();
return 0;
}
OpenCV中的HOG SVM物體分類
opencv官方的svm 在 在看到一段還不錯的 結構清楚,雖然注釋比較少,但很有參考價值,於是我新增了一些注釋,看著更舒服。廢話少說,直接上 cpp view plaincopyprint include cv.h include highgui.h include stdafx.h includ...
自己訓練的Hog Svm 行人檢測
cpp view plaincopyprint include cv.h include highgui.h include stdafx.h include include include include include using namespace cv using namespace std...
HOG SVM原版原始碼learcode的修改與編譯
hog svm原版原始碼,法國人dalal年cvpr05那篇 提供了原始碼,想復現作者結果就想到使用它。它提供了預編譯好的32位程式。anyway,對於需要它的人可能還是要重新編譯它的c 原始碼。在ubuntu 15.10下測試,32 bit 依賴項的問題,我手動編譯了這幾個 blitz 0.9 f...