采用鼠标事件,手动选择样本点,包括目标样本和背景样本。组成训练数据进行训练

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进行图像目标检测和分类的更多相关文章

  1. YOLT:将YOLO用于卫星图像目标检测

    之前作者用滑动窗口和HOG来进行船体监测,在开放水域和港湾取得了不错的成绩,但是对于不一致的复杂背景,这个方法的性能会下降.为了解决这个缺点,作者使用YOLO作为物体检测的流水线,这个方法相比于HOG ...

  2. 使用Caffe完成图像目标检测 和 caffe 全卷积网络

    一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...

  3. 大尺寸卫星图像目标检测:yoloT

    大尺寸卫星图像目标检测:yoloT 1. 前言 YOLT论文全称「You Only Look Twice: Rapid Multi-Scale Object Detection In Satellit ...

  4. 3D点云点云分割、目标检测、分类

    3D点云点云分割.目标检测.分类 原标题Deep Learning for 3D Point Clouds: A Survey 作者Yulan Guo, Hanyun Wang, Qingyong H ...

  5. tensorflow利用预训练模型进行目标检测(三):将检测结果存入mysql数据库

    mysql版本:5.7 : 数据库:rdshare:表captain_america3_sd用来记录某帧是否被检测.表captain_america3_d用来记录检测到的数据. python模块,包部 ...

  6. tensorflow利用预训练模型进行目标检测(四):检测中的精度问题以及evaluation

    一.tensorflow提供的evaluation Inference and evaluation on the Open Images dataset:https://github.com/ten ...

  7. tensorflow利用预训练模型进行目标检测(一):安装tensorflow detection api

    一.tensorflow安装 首先系统中已经安装了两个版本的tensorflow,一个是通过keras安装的, 一个是按照官网教程https://www.tensorflow.org/install/ ...

  8. tensorflow利用预训练模型进行目标检测(二):预训练模型的使用

    一.运行样例 官网链接:https://github.com/tensorflow/models/blob/master/research/object_detection/object_detect ...

  9. CVPR2020:利用图像投票增强点云中的三维目标检测(ImVoteNet)

    CVPR2020:利用图像投票增强点云中的三维目标检测(ImVoteNet) ImVoteNet: Boosting 3D Object Detection in Point Clouds With ...

随机推荐

  1. NSURLSession/NSURLConnection的上传文件方法(已做了更新)

    最好的学习方法就是 领悟 + 证悟. 此篇文章的理论基础主要是与HTTP网络通信协议相关.为集中精力,可以先把TCP/IP协议这些置之不理,也就是先只关注HTTP的请求和响应的结构.HTTP完整的原理 ...

  2. log4net资料收集

    Log4net 日志使用介绍 http://www.cnblogs.com/jys509/p/4699813.html log4net Tutorial http://www.codeproject. ...

  3. dd 生成指定大小文件

    d命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中 ...

  4. 由获取微信access_token引出的Java多线程并发问题

    背景: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.acces ...

  5. subline 快捷键

    subline 快捷键  安装 pretty css  html  后1,CTRl+ shift +H 格式化代码

  6. C#与MATLAB混合编程

    C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010 ma ...

  7. (二)我的Makefile学习冲动&&编译过程概述

    前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...

  8. uva 12655 Trucks [LCA](树链剖分+MST)

    The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...

  9. Codeforces Round #254 DZY Loves Colors

    题意:输入n, m ; 有n给位置, 初始时第i个位置的color为i, colorfulness为0.      有m次操作,一种是把成段的区域color更新为x, 对于更新的区域,每个位置(令第i ...

  10. Android ImageButton图像灰色边框

    灰色边框,是imageButton空间自带的. 第一种解决方案: android:scaleType="fitXY"//这个代码是:拉伸图片(不按比例)以填充的长宽.所以图像最后最 ...