Hu矩SVM訓練及檢測-----OpenCV


關鍵詞:Hu矩,SVM,OpenCV 

在圖像中進行目標物識別,涉及到特定區域內是否存在目標物,SVM可在樣本量較少情況下對正負樣本(圖片中前景背景)做出良好區分,圖片基本特征包括諸如HOG、LBP、HAAR等,在具體進行物體檢測時考慮結合待檢測物特點利用或設計新特征進行訓練並分類。本文以幾何不變矩為例說明OpenCV中SVM分類器的一般使用過程,下面依次簡述Hu矩函數、SVM參數設置及實例演示。

1.Hu求解

double M[7];//Hu矩輸出
Moments mo; //矩變量

src=imread(path, IMREAD_GRAYSCALE);//獲取圖像

canny_output=preDispose(src);//原始圖像初步處理
resize(canny_output, imageNewSize, sampleSize, CV_INTER_LINEAR);//尺寸歸一化
//計算Hu矩
mo=moments(imageNewSize);
HuMoments(mo, M);

2.SVM訓練過程

1)訓練矩陣變量

Mat trainData(a,b,CV_32FC1);//待訓練樣本集 a:樣本總數 b:特征個數
Mat labels(a,1,CV_32FC1);//與訓練數據相應的標簽 a:樣本總數

2)SVM參數設置

CvSVMParams SVM_params; // CvSVMParams結構用於定義基本參數
SVM_params.svm_type = CvSVM::C_SVC; // SVM類型
SVM_params.kernel_type = CvSVM::LINEAR; // 不做映射
SVM_params.degree = 0;
SVM_params.gamma = 1;
SVM_params.coef0 = 0;
SVM_params.C = 1;
SVM_params.nu = 0;
SVM_params.p = 0;
SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);

3)SVM訓練及保存

CvSVM svm;
svm.train(trainData, labels, Mat(), Mat(), SVM_params);

svm.save("svm_para.xml");

4)SVM樣本檢測

CvSVM svm;
svm.load("svm_para.xml");

float response = svm.predict(test);//test:待檢測樣本特征

3.訓練及檢測實例

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>

#include <iostream>

 

using namespace cv;
using namespace std;

Mat preDispose(Mat src);
Size sampleSize(160,160);//樣本的大小

int main()
{
Mat trainData(20,7,CV_32FC1);//待訓練樣本集
Mat labels(20,1,CV_32FC1);//與訓練數據相應的標簽
Mat canny_output;
Mat imageNewSize;

char path[90];//圖片路徑
Mat src;//輸入圖片
double M[7];//Hu矩
Moments mo; //矩變量

float* p; //data行變量
int train_samples=10;

for(int i=0;i<2;++i)
{
for(int j=0;j<10;++j)
{
if(i==0)
sprintf_s(path, "negtive/%d.jpg", j);
else
sprintf_s(path, "positive/%d.jpg", j);
src=imread(path, IMREAD_GRAYSCALE);

canny_output=preDispose(src);
resize(canny_output, imageNewSize, sampleSize, CV_INTER_LINEAR);
//計算Hu矩
mo=moments(imageNewSize);
HuMoments(mo, M);
//訓練樣本集賦值
Mat C = (Mat_<double>(1,7) << M[0],M[1],M[2],M[3],M[4],M[5], M[6]);
C.convertTo(trainData(Range(i*train_samples + j, i*train_samples + j + 1), Range(0, trainData.cols)), CV_32FC1);
//標簽賦值
labels.at<float>(i*train_samples + j,0) = i;
}
}

CvSVMParams SVM_params; // CvSVMParams結構用於定義基本參數
SVM_params.svm_type = CvSVM::C_SVC; // SVM類型
SVM_params.kernel_type = CvSVM::LINEAR; // 不做映射
SVM_params.degree = 0;
SVM_params.gamma = 1;
SVM_params.coef0 = 0;
SVM_params.C = 1;
SVM_params.nu = 0;
SVM_params.p = 0;
SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);

CvSVM svm;
svm.train(trainData, labels, Mat(), Mat(), SVM_params);
SVM.save("svm_para.xml");
//CvSVM svm;
//svm.load("svm_para.xml");

for(int i=0;i<8;++i)
{
sprintf_s(path, "test/%d.jpg", i);

src=imread(path, IMREAD_GRAYSCALE);
canny_output=preDispose(src);
resize(canny_output, imageNewSize, sampleSize, CV_INTER_LINEAR);
imshow("canny",imageNewSize);
//計算Hu矩
mo=moments(imageNewSize);
HuMoments(mo, M);
//樣本賦值
Mat test(1,7,CV_32FC1);
Mat C = (Mat_<double>(1,7) << M[0],M[1],M[2],M[3],M[4],M[5], M[6]);
C.convertTo(test(Range(0, 1), Range(0, 7)), CV_32FC1);
float response = svm.predict(test);
cout<<response<<endl;
}

waitKey(0);
return EXIT_SUCCESS;
}                

資源:

https://share.weiyun.com/5LRwSxS

https://share.weiyun.com/5kLvDQS


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM