在opencv3中利用SVM进行图像目标检测和分类
采用鼠标事件,手动选择样本点,包括目标样本和背景样本。组成训练数据进行训练
1、主函数
#include "stdafx.h"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace cv::ml; Mat img,image;
Mat targetData, backData;
bool flag = true;
string wdname = "image"; void on_mouse(int event, int x, int y, int flags, void* ustc); //鼠标取样本点
void getTrainData(Mat &train_data, Mat &train_label); //生成训练数据
void svm(); //svm分类 int main(int argc, char** argv)
{
string path = "d:/peppers.png";
img = imread(path);
img.copyTo(image);
if (img.empty())
{
cout << "Image load error";
return ;
}
namedWindow(wdname);
setMouseCallback(wdname, on_mouse, ); for (;;)
{
imshow("image", img); int c = waitKey();
if ((c & ) == )
{
cout << "Exiting ...\n";
break;
}
if ((char)c == 'c')
{
flag = false;
}
if ((char)c == 'q')
{
destroyAllWindows();
break;
}
}
svm();
return ;
}
首先输入图像,调用setMouseCallback函数进行鼠标取点
2、鼠标事件
//鼠标在图像上取样本点,按q键退出
void on_mouse(int event, int x, int y, int flags, void* ustc)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
Point pt = Point(x, y);
Vec3b point = img.at<Vec3b>(y, x); //取出该坐标处的像素值,注意x,y的顺序
Mat tmp = (Mat_<float>(, ) << point[], point[], point[]);
if (flag)
{
targetData.push_back(tmp); //加入正样本矩阵
circle(img, pt, , Scalar(, , ), -, ); //画圆,在图上显示点击的点 } else
{
backData.push_back(tmp); //加入负样本矩阵
circle(img, pt, , Scalar(, , ), -, ); }
imshow(wdname, img);
}
}
用鼠标在图像上点击,取出当前点的红绿蓝像素值进行训练。先选择任意个目标样本,然后按"c“键后选择任意个背景样本。样本数可以自己随意决定。样本选择完后,按”q"键完成样本选择。
3、svm分类
void getTrainData(Mat &train_data, Mat &train_label)
{
int m = targetData.rows;
int n = backData.rows;
cout << "正样本数::" << m << endl;
cout << "负样本数:" << n << endl;
vconcat(targetData, backData, train_data); //合并所有的样本点,作为训练数据
train_label = Mat(m + n, , CV_32S, Scalar::all()); //初始化标注
for (int i = m; i < m + n; i++)
train_label.at<int>(i, ) = -;
} void svm()
{
Mat train_data, train_label;
getTrainData(train_data, train_label); //获取鼠标选择的样本训练数据 // 设置参数
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR); // 训练分类器
Ptr<TrainData> tData = TrainData::create(train_data, ROW_SAMPLE, train_label);
svm->train(tData); Vec3b color(, , );
// Show the decision regions given by the SVM
for (int i = ; i < image.rows; ++i)
for (int j = ; j < image.cols; ++j)
{
Vec3b point = img.at<Vec3b>(i, j); //取出该坐标处的像素值
Mat sampleMat = (Mat_<float>(, ) << point[], point[], point[]);
float response = svm->predict(sampleMat); //进行预测,返回1或-1,返回类型为float
if ((int)response != )
image.at<Vec3b>(i, j) = color; //将背景点设为黑色
} imshow("SVM Simple Example", image); // show it to the user
waitKey();
}
将正负样本矩阵,用vconcat合并成一个矩阵,用作训练分类器,并对相应的样本进行标注。最后将识别出的目标保留,将背景部分调成黑色。
4、完整程序
// svm.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace cv::ml; Mat img,image;
Mat targetData, backData;
bool flag = true;
string wdname = "image"; void on_mouse(int event, int x, int y, int flags, void* ustc); //鼠标取样本点
void getTrainData(Mat &train_data, Mat &train_label); //生成训练数据
void svm(); //svm分类 int main(int argc, char** argv)
{
string path = "d:/peppers.png";
img = imread(path);
img.copyTo(image);
if (img.empty())
{
cout << "Image load error";
return ;
}
namedWindow(wdname);
setMouseCallback(wdname, on_mouse, ); for (;;)
{
imshow("image", img); int c = waitKey();
if ((c & ) == )
{
cout << "Exiting ...\n";
break;
}
if ((char)c == 'c')
{
flag = false;
}
if ((char)c == 'q')
{
destroyAllWindows();
break;
}
}
svm();
return ;
} //鼠标在图像上取样本点,按q键退出
void on_mouse(int event, int x, int y, int flags, void* ustc)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
Point pt = Point(x, y);
Vec3b point = img.at<Vec3b>(y, x); //取出该坐标处的像素值,注意x,y的顺序
Mat tmp = (Mat_<float>(, ) << point[], point[], point[]);
if (flag)
{
targetData.push_back(tmp); //加入正样本矩阵
circle(img, pt, , Scalar(, , ), -, ); //画出点击的点 } else
{
backData.push_back(tmp); //加入负样本矩阵
circle(img, pt, , Scalar(, , ), -, ); }
imshow(wdname, img);
}
} void getTrainData(Mat &train_data, Mat &train_label)
{
int m = targetData.rows;
int n = backData.rows;
cout << "正样本数::" << m << endl;
cout << "负样本数:" << n << endl;
vconcat(targetData, backData, train_data); //合并所有的样本点,作为训练数据
train_label = Mat(m + n, , CV_32S, Scalar::all()); //初始化标注
for (int i = m; i < m + n; i++)
train_label.at<int>(i, ) = -;
} void svm()
{
Mat train_data, train_label;
getTrainData(train_data, train_label); //获取鼠标选择的样本训练数据 // 设置参数
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR); // 训练分类器
Ptr<TrainData> tData = TrainData::create(train_data, ROW_SAMPLE, train_label);
svm->train(tData); Vec3b color(, , );
// Show the decision regions given by the SVM
for (int i = ; i < image.rows; ++i)
for (int j = ; j < image.cols; ++j)
{
Vec3b point = img.at<Vec3b>(i, j); //取出该坐标处的像素值
Mat sampleMat = (Mat_<float>(, ) << point[], point[], point[]);
float response = svm->predict(sampleMat); //进行预测,返回1或-1,返回类型为float
if ((int)response != )
image.at<Vec3b>(i, j) = color; //将背景设置为黑色
} imshow("SVM Simple Example", image);
waitKey();
}
输入原图像:
程序运行后显示:
在opencv3中利用SVM进行图像目标检测和分类的更多相关文章
- YOLT:将YOLO用于卫星图像目标检测
之前作者用滑动窗口和HOG来进行船体监测,在开放水域和港湾取得了不错的成绩,但是对于不一致的复杂背景,这个方法的性能会下降.为了解决这个缺点,作者使用YOLO作为物体检测的流水线,这个方法相比于HOG ...
- 使用Caffe完成图像目标检测 和 caffe 全卷积网络
一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...
- 大尺寸卫星图像目标检测:yoloT
大尺寸卫星图像目标检测:yoloT 1. 前言 YOLT论文全称「You Only Look Twice: Rapid Multi-Scale Object Detection In Satellit ...
- 3D点云点云分割、目标检测、分类
3D点云点云分割.目标检测.分类 原标题Deep Learning for 3D Point Clouds: A Survey 作者Yulan Guo, Hanyun Wang, Qingyong H ...
- tensorflow利用预训练模型进行目标检测(三):将检测结果存入mysql数据库
mysql版本:5.7 : 数据库:rdshare:表captain_america3_sd用来记录某帧是否被检测.表captain_america3_d用来记录检测到的数据. python模块,包部 ...
- tensorflow利用预训练模型进行目标检测(四):检测中的精度问题以及evaluation
一.tensorflow提供的evaluation Inference and evaluation on the Open Images dataset:https://github.com/ten ...
- tensorflow利用预训练模型进行目标检测(一):安装tensorflow detection api
一.tensorflow安装 首先系统中已经安装了两个版本的tensorflow,一个是通过keras安装的, 一个是按照官网教程https://www.tensorflow.org/install/ ...
- tensorflow利用预训练模型进行目标检测(二):预训练模型的使用
一.运行样例 官网链接:https://github.com/tensorflow/models/blob/master/research/object_detection/object_detect ...
- CVPR2020:利用图像投票增强点云中的三维目标检测(ImVoteNet)
CVPR2020:利用图像投票增强点云中的三维目标检测(ImVoteNet) ImVoteNet: Boosting 3D Object Detection in Point Clouds With ...
随机推荐
- C++静态计算的例子
写一个函数,用递归函数完成以下运算: sum(n) = 1 – 1/2 + 1/3 – 1/4 + … -(1/n)*(-1)n (其中n>0) 函数原型: fl ...
- 微信开发(03)之新建按钮时报错 errcode 40054
在微信开发新建公众号的按钮时,报错如下: {errcode:40054,errmsg:"invalid sub button url domain"} 经过仔细排查,发现是url地 ...
- 在jsp中默认写上的一段java代码表示basePath 的路径的具体的意思是什么?
<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" ...
- 烂泥:LVM学习之逻辑卷LV及卷组扩容VG
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章中介绍了有关LVM基础的知识,这篇文章我们来介绍如何给LVM的逻辑卷LV及卷组VG扩容. LVM的逻辑卷,我们知道它最后相当于一个分区,既然是一 ...
- php浮点型以及精度问题
浮点型(也叫浮点数 float,双精度数 double 或实数 real) 浮点数的形式表示: LNUM [0-9]+DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9 ...
- 获取bing每日图片
http://global.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US 其中idx表示倒数第几张图片 ...
- Windows8下PhoneGap 4 + Android Studio 1.0 + VS2013配置指南
1.准备工作 安装JDK1.6+,设置环境变量 JAVA_HOME C:\Program Files\Java\jdk1.5.0_07 CLASSPATH .;%JAVA_HOME%\lib Path ...
- phpcmsv9 标题颜色显示问题
在解决标题颜色问题之前首先要注意到 标题字段为title,副标题为fu_title. 如果一个文章想在首页推荐,又想在栏目首页推荐,并且这两个推荐位置的标题长度不一样,那只能用副标题区别,这样就可以在 ...
- HDU 1556 Color the ball
这题用线段树的话简直就是一个水题..不过刚学树状数组,要用一下. 题意:每次给你a,b,表明a~b之间涂色,然后最后一次输出每个气球被涂色的次数. 要用树状数组就要考虑怎么转化为前缀和问题,这题可以这 ...
- POJ 1201 Intervals
题意:有n个区间[a,b],每个区间有一个值c.找一个集合中的元素使得每个区间至少有c个元素在这个集合中,问最小的集合大小. 思路:设d[i+1]表示0到i有多少个数在这个集合中,显然对于每个区间,d ...