关键词: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;
}                

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

  1. opencv中的图像矩(空间矩,中心矩,归一化中心矩,Hu矩)

    严格来讲矩是概率与统计中的一个概念,是随机变量的一种数字特征.设 x 为随机变量,C为常数,则量E[(x−c)^k]称为X关于C点的k阶矩.比较重要的两种情况如下: 1.c=0,这时a_k=E(X^k ...

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

    https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn. ...

  3. 【计算机视觉】如何使用opencv自带工具训练人脸检测分类器

    前言 使用opencv自带的分类器效果并不是很好,由此想要训练自己的分类器,正好opencv有自带的工具进行训练.本文就对此进行展开. 步骤 1.查找工具文件: 2.准备样本数据: 3.训练分类器: ...

  4. 【图像算法OpenCV】几何不变矩--Hu矩

    原文地址  http://blog.csdn.NET/daijucug/article/details/7535370 [图像算法OpenCV]几何不变矩--Hu矩 一 原理 几何矩是由Hu(Visu ...

  5. opencv —— moments 矩的计算(空间矩/几何矩、中心距、归一化中心距、Hu矩)

    计算矩的目的 从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的几何特征信息,如大小,位置.方向和形状等.这种描述能力广泛应用于各种图像处理.计算机视觉和机器人 ...

  6. Hog SVM 车辆 行人检测

    HOG SVM 车辆检测 近期需要对卡口车辆的车脸进行检测,首先选用一个常规的检测方法即是hog特征与SVM,Hog特征是由dalal在2005年提出的用于道路中行人检测的方法,并且取的了不错的识别效 ...

  7. 图片人脸检测——OpenCV版(二)

    图片人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 往期目录 视频人脸检测——Dlib版(六)OpenCV添加中文(五)图片人脸检测——Dlib版(四 ...

  8. yolov2在CUDA8.0+cudnn8.0下安装、训练、检测经历

    这次用yolov2做检测时遇到个大坑,折腾了我好几天,特以此文记录之. 一.安装cuda+cudnn 它们的版本必须要匹配,否则训练后检测不出目标! 1.下载cuda8.0.61_375.26_lin ...

  9. 几何不变矩--Hu矩

    [图像算法]图像特征: ---------------------------------------------------------------------------------------- ...

随机推荐

  1. 学习CSS一些事(下)

    2.浮动(float) 浮动(float)特点:1.元素会左移.右移,直到触碰到容器为止.    2.设置浮动元素,仍旧处于标准文档流. 3.当元素没有设置宽度值,而设置了浮动属性,元素的宽度随着内容 ...

  2. jquery对同级的td做radio限制

    <html> <head> <title></title> <script src="http://libs.baidu.com/jqu ...

  3. sql - 复制表

    1,复制表结构和内容 1)这个表: select * into new_table_name from old_table_name ref:SQL复制数据表及表结构

  4. sql - sum() 和 count() 函数的区别

    对sql一直都是蜻蜓点水,突然也觉得对这两个函数的区别有点朦胧,查了一下,在这里说一下: sum():主要用于累加求和. count():主要用于行(记录)的统计.

  5. asp.net 读取sql存储过程返回值

    关于Exec返回值的问题有很多,在这做个简要的总结. 读查询语句示例:    Declare @count int     select @Count 要点:                      ...

  6. openssl提取pfx证书密钥对

    刚做银联的项目,对方给了1.pfx和1.cer两个测试文件,总结一下利用这两个文件提取出文本 银联提供两个测试证书  1.pfx 和 1.cer . 其中 pfx证书包含RSA的公钥和密钥;cer证书 ...

  7. JavaScript_数组

    /** * 数组本身也是对象 * js中数组类似于java里的map容器 长度可随意改变 ,元素类型任意 * */ // var arr = new Array(); // var arr = [1, ...

  8. 0.0C语言重点问题回顾

    左值和右值得区别:左值是用来表明变量的身份的,右值更加侧重于值本身: void*是个例外,它只有基地址没有类型信息,所以无法解引用. int *p = malloc(100); char *s = m ...

  9. 利用C++ RAII技术自动回收堆内存

    在C++的编程过程中,我们经常需要申请一块动态内存,然后当用完以后将其释放.通常而言,我们的代码是这样的: 1: void func() 2: { 3: //allocate a dynamic me ...

  10. 转型函数 Boolean()

    布尔值有2种可能的值true和false;但 ECMAScript中所有类型的值都有与这两个 Boolean 值 等价的值.要将一个值转换为其对应的 Boolean 值,可以调用转型函数 Boolea ...