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;
}
Hu矩SVM训练及检测-----OpenCV的更多相关文章
- opencv中的图像矩(空间矩,中心矩,归一化中心矩,Hu矩)
严格来讲矩是概率与统计中的一个概念,是随机变量的一种数字特征.设 x 为随机变量,C为常数,则量E[(x−c)^k]称为X关于C点的k阶矩.比较重要的两种情况如下: 1.c=0,这时a_k=E(X^k ...
- opencv计算两个轮廓之间hu矩相似程度,MatchShapes
https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn. ...
- 【计算机视觉】如何使用opencv自带工具训练人脸检测分类器
前言 使用opencv自带的分类器效果并不是很好,由此想要训练自己的分类器,正好opencv有自带的工具进行训练.本文就对此进行展开. 步骤 1.查找工具文件: 2.准备样本数据: 3.训练分类器: ...
- 【图像算法OpenCV】几何不变矩--Hu矩
原文地址 http://blog.csdn.NET/daijucug/article/details/7535370 [图像算法OpenCV]几何不变矩--Hu矩 一 原理 几何矩是由Hu(Visu ...
- opencv —— moments 矩的计算(空间矩/几何矩、中心距、归一化中心距、Hu矩)
计算矩的目的 从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的几何特征信息,如大小,位置.方向和形状等.这种描述能力广泛应用于各种图像处理.计算机视觉和机器人 ...
- Hog SVM 车辆 行人检测
HOG SVM 车辆检测 近期需要对卡口车辆的车脸进行检测,首先选用一个常规的检测方法即是hog特征与SVM,Hog特征是由dalal在2005年提出的用于道路中行人检测的方法,并且取的了不错的识别效 ...
- 图片人脸检测——OpenCV版(二)
图片人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 往期目录 视频人脸检测——Dlib版(六)OpenCV添加中文(五)图片人脸检测——Dlib版(四 ...
- yolov2在CUDA8.0+cudnn8.0下安装、训练、检测经历
这次用yolov2做检测时遇到个大坑,折腾了我好几天,特以此文记录之. 一.安装cuda+cudnn 它们的版本必须要匹配,否则训练后检测不出目标! 1.下载cuda8.0.61_375.26_lin ...
- 几何不变矩--Hu矩
[图像算法]图像特征: ---------------------------------------------------------------------------------------- ...
随机推荐
- codevs2492上帝造题的七分钟 2(线段树)
/* 区间修改 区间查询 可以用线段树搞 但是一般的标记下放对这个题好像不合适 只能改叶子 然后更新父亲(虽然跑的有点慢) 小优化:如果某个点是1 就不用再开方了 所以搞一个f[i]标记 i 这个点还 ...
- Dij的堆优化
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #i ...
- Java数字、货币值和百分数等的格式化处理
如果我们用下列语句输出一个数 System.out.println(123456.789); 将会在Console看到输出 123456.789 那么如何得到123,456.789这种格式化的输出呢? ...
- css 圆角效果
http://intacto10years.com/index_start.php<div style="width:800px; height:1300px;">&l ...
- iOS9升级后第三方平台无法分享的问题
最近升级到了Xcode7,在真机调试中发现在初始化微博SDK时程序Crash. 解决办法从微博官网下一个最新的SDK,替换掉工程中的即可. 2.替换微博最新SDK之后成功运行程序,之后发现微信.QQ. ...
- C++学习之DLL注入
#include<stdio.h> #include<Windows.h> #include<TlHelp32.h> //typedef unsigned long ...
- js 实现win7任务栏拖动效果
前言 在某个时刻, 我认识了一个朋友. 此人在我的教唆下, 踏上了js的不归路. 前天他问我, Win7任务栏拖动效果怎么实现. 我随口就跟他说, 这简单的一逼. 在我一晚上的折腾之后, 一份潦草的代 ...
- ubantu-命令-进入超级用户
sudo su; 建立文件夹 mkdir ulike_work;
- php防止SQL注入详解及防范
SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...
- python运维开发之第十天
一.多进程 1.进程模块 multiprocessing 简单的创建一个进程 #!/usr/bin/env python # -*- coding: utf- -*- # @Author : Will ...