关键词: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. ajax请求aspx页面

    首先,这么用是不好的.最好用ashx,但也难免遇到这种需求.开发过这么一个系统,每天访问量最多100,web服务器压力很小,完全大马拉小车,主要压力都在数据库服务器上,要做大量的统计.所以页面直接全上 ...

  2. MySQL拷贝表的几种方式

    假如我们有以下这样一个表: id      username    password ----------------------------------- 1       admin       * ...

  3. EXPDP IMPDP 知识总结

    Data Pump Export ATTACH Default: job currently in the user's schema, if there is only one Purpose(目的 ...

  4. ASP.NET菜鸟之路之Application小例子

    背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. Session介绍 Application对象用 ...

  5. 基于ThinkPHP+AJAX的省市区三级联动

    练习,就当练习. 省市区三级联动,样式如下图所示: 1,导入两个js文件并且导入数据库文件. 两个js文件分别是jquery-2.1.4.min.js和jquery-1.js,数据库文件,见附件. 2 ...

  6. 【USACO 2.3.1】最长前缀

    [题目描述] 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当 ...

  7. js学习笔记之:键盘应用

    为了方便用户操作,可以为用户设置(或者屏蔽)功能键,代替使用频率比较高的操作.本次,将学习一下基本的功能键使用方法.键盘和焦点使用.屏蔽按键等知识点,以及一些相关示例: 1 设置按键功能: 功能键主要 ...

  8. js删除选中的复选框中的父辈。

    function scsx(){ var cb=document.getElementsByName('checkbox') if(confirm('删除?')){ for (var i=0;i< ...

  9. JQUERY1.9学习笔记 之基本过滤器(十) 非选择器

    非选择器jQuery( ":not(selector)" ) 例:找出所有input标签为非"checked"的,并且高亮其邻居元素span. <!DOC ...

  10. JS动态加载 js css

    1.动态加载js function loadScript( url ){ var script = document.createElement( "script" ); scri ...