在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 ...
随机推荐
- NSURLSession/NSURLConnection的上传文件方法(已做了更新)
最好的学习方法就是 领悟 + 证悟. 此篇文章的理论基础主要是与HTTP网络通信协议相关.为集中精力,可以先把TCP/IP协议这些置之不理,也就是先只关注HTTP的请求和响应的结构.HTTP完整的原理 ...
- log4net资料收集
Log4net 日志使用介绍 http://www.cnblogs.com/jys509/p/4699813.html log4net Tutorial http://www.codeproject. ...
- dd 生成指定大小文件
d命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中 ...
- 由获取微信access_token引出的Java多线程并发问题
背景: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.acces ...
- subline 快捷键
subline 快捷键 安装 pretty css html 后1,CTRl+ shift +H 格式化代码
- C#与MATLAB混合编程
C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010 ma ...
- (二)我的Makefile学习冲动&&编译过程概述
前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...
- uva 12655 Trucks [LCA](树链剖分+MST)
The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...
- Codeforces Round #254 DZY Loves Colors
题意:输入n, m ; 有n给位置, 初始时第i个位置的color为i, colorfulness为0. 有m次操作,一种是把成段的区域color更新为x, 对于更新的区域,每个位置(令第i ...
- Android ImageButton图像灰色边框
灰色边框,是imageButton空间自带的. 第一种解决方案: android:scaleType="fitXY"//这个代码是:拉伸图片(不按比例)以填充的长宽.所以图像最后最 ...