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;
}                

时间: 2024-12-19 12:59:55

Hu矩SVM训练及检测-----OpenCV的相关文章

OpenCV的HOG+SVM训练程序注意事项

行人训练:http://www.tuicool.com/articles/MvYfui 字符识别:http://www.haogongju.net/art/2328003 用OpenCV使用HOG特征进行SVM算法训练的大概流程是 1)设置训练样本集 需要两组数据,一组是数据的类别,一组是数据的向量信息. 2)设置SVM参数,参考<机器模式->libSVM之参数说明> 注意必须使用线性SVM进行训练,因为检测函数只支持线性检测!!! 3)使用HOGDescriptor计算hog特征 4)

正式使用opencv里的训练和检测 - opencv_createsamples、opencv_traincascade

好久没有来写blog了,学生生涯终结,就不好好总结了,今天把opencv里关于adaboost训练和检测的过程记录下来,方便别人也方便自己~~~啊哈哈~~~~ 一.基础知识准备 首先,opencv目前仅支持三种特征的训练检测, HAAR.LBP.HOG,选择哪个特征就去补充哪个吧.opencv的这个训练算法是基于adaboost而来的,所以需要先对adaboost进行基础知识补充啊,网上一大堆资料,同志们速度去查阅.我的资源里也有,大家去下载吧,这些我想都不是大家能直接拿来用的,我下面将直接手把

opencv计算两个轮廓之间hu矩相似程度,MatchShapes

https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn.net/rrrfff/article/details/77340641 OPENCV提供了输入图像直接进行hu矩匹配的函数,返回的是两个图像或轮廓之间hu矩的相似度: double cvMatchShapes(const void*object1,const void*object2,int met

利用opencv中的级联分类器进行人脸检测-opencv学习(1)

OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本的C++接口除了Haar特征以外也可以使用LBP特征. 先介绍一下相关的结构,级联分类器的计算特征值的基础类FeatureEvaluator,功能包括读操作read.复制clone.获得特征类型getFeatureType,分配图片分配窗口的操作setImage.setWindow,计算有序特征calcOrd,计算绝对特征calcC

Python图像处理(9):Hu矩

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 几何矩是由Hu在1962年提出的,具有平移.旋转和尺度不变性.opencv中关于矩的计算是由C++中的Moments这个类来完成的: //! raster image moments class CV_EXPORTS_W_MAP Moments { public: //! the default constructor Moments(); //! the full constructor Mo

hu矩

简单说:由普通矩mpq得到图像的中心x0,y0,进而定义中心矩upq,对中心矩进行归一化得到归一化中心矩ypq.用归一化中心矩的二阶矩和三阶矩构造7个不变矩. 一 原理 几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移.旋转和尺度不变性. 定义如下: ① (p+q)阶不变矩定义: ② 对于数字图像,离散化,定义为: ③ 归一化中心矩定义: ④Hu矩定义

【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的ml包含了很多的ML框架接口,就试试了. 详细的OpenCV文档:http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html mnist数据下载:http://yann.l

【OpenCV】基于HOG与SVM的行人检测学习

最近听了关于HOG与SVM的报告,比较深刻的学习了算法原理与实现方式.这里根据一些资料作下总结,方便日后拾起: A.方向梯度直方图(HOG,Histogram of Gradient) 将图像依次划分为检测窗口(window).块(block).胞元(cell)3个层次 大体流程: 逐像素计算方向梯度: 对cell中的像素根据梯度划分区间,给出统计直方图: 对于每个block中重叠的cell进行对比度归一化: 把所有直方图向量组成HOG特征向量. HOG特征向量: OpenCV对于HOG描述子(

如何用OpenCV自带的adaboost程序训练并检测目标

http://www.cnblogs.com/easymind223/archive/2012/07/03/2574826.html OpenCV自带的adaboost程序能够根据用户输入的正样本集与负样本集训练分类器,常用于人脸检测,行人检测等.它的默认特征采用了Haar,不支持其它特征. Adaboost的原理简述:(原文) 每个Haar特征对应看一个弱分类器,但并不是任伺一个Haar特征都能较好的描述人脸灰度分布的某一特点,如何从大量的Haar特征中挑选出最优的Haar特征并制作成分类器用