#include "opencv2/opencv.hpp"
#include "CameraCalibration.h"
using namespace cv;
using namespace std;
Size SampleSize(60,60); //训练正样本尺寸
uchar TrainSample = 200; //每个种类的样本数
uchar Classes = 5; //样本种类
Mat Train_data,TrainClasses; //声明训练数据和响应数据
string str0 = "Hollow Cylinder"; //空心圆柱
string str1 = "Cube"; //正方体
string str2 = "Cone"; //圆锥
string str3 = "Cylindrical"; //圆柱
string str4 = "Cuboid"; //长方体
string Picture_Name;
int Picture_NameCounter=1;
Mat CalibrationImage;
Mat element = getStructuringElement(MORPH_RECT,Size(9,9));
void Get_TrainData(void);
void ReadImage_to_SaveBoundingRect(const Mat& Image,vector<Rect>& TemRectangle);
Mat Background_separation(const Mat& Image);
void main()
{
Mat GrayImage,BinaryImage,TestImage;
CameraCalibration_Init();
namedWindow("【CalibrationImage】",WINDOW_AUTOSIZE);
CvSVMParams SVM_Params;
SVM_Params.svm_type = CvSVM::C_SVC; //SVM类型(允许用异常值惩罚因子C进行不完全分类)
SVM_Params.kernel_type = CvSVM::LINEAR; //SVM的内核类型
SVM_Params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER,10000,1e-6);//指定迭代终止的条件
printf("\t\t\t\t开始获取训练集数据\n");
Get_TrainData();
printf("\t\t\t\t成功获取训练集数据\n");
printf("\t\t\t\tSVM训练样本开始\n");
CvSVM SVM_Classifier;
SVM_Classifier.train_auto(Train_data,TrainClasses,Mat(),Mat(),SVM_Params);//自动训练并优化参数
SVM_Classifier.save("svm.xml");
printf("\t\t\t\tSVM训练样本结束\n");
while(1)
{
ReturnCameraCalibration(CalibrationImage);
imshow("【CalibrationImage】",CalibrationImage);
cvtColor(CalibrationImage,GrayImage,COLOR_BGR2GRAY);
GaussianBlur(GrayImage,GrayImage,Size(7,7),0,0);
BinaryImage = Background_separation(CalibrationImage);
vector<Rect> TemRectangle;
ReadImage_to_SaveBoundingRect(BinaryImage,TemRectangle);
for (unsigned int i=0;i<TemRectangle.size();i++)
{
TestImage = GrayImage(TemRectangle[i]);
Mat imageNewSize;
resize(TestImage, imageNewSize, SampleSize); //统一摄像头画面里面采集到的轮廓图像的尺寸
TestImage.release(); //把image的矩阵信息释放(清除)
TestImage = imageNewSize.reshape(0, 1); //图像深度不变,把图片矩阵转为一行储存
TestImage.convertTo(TestImage, CV_32FC1);
int Response = static_cast<int>(SVM_Classifier.predict(TestImage));
switch (Response)
{
case 0:
rectangle(CalibrationImage,TemRectangle[i],Scalar(0,0,255),1,8);
putText(CalibrationImage, str0, Point(TemRectangle[i].x + TemRectangle[i].width / 2, TemRectangle[i].y + TemRectangle[i].height / 2),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
break;
case 1:
rectangle(CalibrationImage,TemRectangle[i],Scalar(0,0,255),1,8);
putText(CalibrationImage, str1, Point(TemRectangle[i].x + TemRectangle[i].width / 2, TemRectangle[i].y + TemRectangle[i].height / 2),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
break;
case 2:
rectangle(CalibrationImage,TemRectangle[i],Scalar(0,0,255),1,8);
putText(CalibrationImage, str2, Point(TemRectangle[i].x + TemRectangle[i].width / 2, TemRectangle[i].y + TemRectangle[i].height / 2),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
break;
case 3:
rectangle(CalibrationImage,TemRectangle[i],Scalar(0,0,255),1,8);
putText(CalibrationImage, str3, Point(TemRectangle[i].x + TemRectangle[i].width / 2, TemRectangle[i].y + TemRectangle[i].height / 2),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
break;
case 4:
rectangle(CalibrationImage,TemRectangle[i],Scalar(0,0,255),1,8);
putText(CalibrationImage, str4, Point(TemRectangle[i].x + TemRectangle[i].width / 2, TemRectangle[i].y + TemRectangle[i].height / 2),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
break;
default: break;
}
}
imshow("【效果图】",CalibrationImage);
uchar keyValue = (uchar)waitKey(1);
if (keyValue == 27) break;
else if(keyValue == 'q')
{
printf("\t\t已成功保存%d张图片至工程文件夹\n",Picture_NameCounter);
Picture_Name = to_string(static_cast<long double>(Picture_NameCounter++))+".jpg"; //to_string:将数值转化为字符串。返回对应的字符串
imwrite(Picture_Name,CalibrationImage);
}
}
}
void Get_TrainData(void)
{
Train_data.create(TrainSample*Classes+2000,SampleSize.height*SampleSize.width,CV_32FC1);//每个种类的样本数为TrainSample,种类为Classes,
TrainClasses.create(TrainSample*Classes+2000, 1, CV_32FC1); //创建TrainSample*Classes行、SampleSize.width*SampleSize.height列的矩阵存储信息(将一副图像的信息转为一行储存),训练数据必须是CV_32FC1
Mat TemparyImage,ImageNewSize;
char file[255];
for (unsigned int i=0;i<Classes;i++)
{
for (unsigned int j=1;j<=TrainSample;j++)//训练集标号从1开始
{
sprintf(file,"samples/positive/s%d/%d.jpg",i,j);
TemparyImage = imread(file,IMREAD_GRAYSCALE);
if (TemparyImage.empty())
{
printf("\t\t\tError: Cant load image %s\n", file);
continue;
}
resize(TemparyImage,ImageNewSize,SampleSize); //统一训练集尺寸
TemparyImage.release(); //把TemparyImage的矩阵信息释放(清除)
TemparyImage = ImageNewSize.reshape(0,1); //图像深度不变,把图片矩阵转为一行储存
TemparyImage.convertTo(Train_data(Range(i*Classes+j-1,i*Classes+j),Range(0,Train_data.cols)),CV_32FC1);//Range为定义ROI的方式之一,表示从起始到终止索引(不包括终止索引)的连续序列
TrainClasses.at<float>(i*Classes+j-1,0) = i;
}
}
for (unsigned int i =1;i<=200;i++)
{
sprintf(file, "samples/negative/%d.jpg",i);
Mat SrcImage = imread(file,IMREAD_GRAYSCALE);
if (SrcImage.empty())
{
printf("\t\t\tError: Cant load image %s\n", file);
continue;
}
resize(SrcImage,ImageNewSize,SampleSize); //统一训练集尺寸
SrcImage.release(); //把TemparyImage的矩阵信息释放(清除)
SrcImage = ImageNewSize.reshape(0,1); //图像深度不变,把图片矩阵转为一行储存
SrcImage.convertTo(Train_data(Range(999+i,999+i+1),Range(0,Train_data.cols)),CV_32FC1);//Range为定义ROI的方式之一,表示从起始到终止索引(不包括终止索引)的连续序列
TrainClasses.at<float>(999+i,0) = -1;
}
}
/*-------背景分离-----*/
Mat Background_separation(const Mat& Image)
{
Mat HSVimage,BinaryImage;
cvtColor(Image,HSVimage,COLOR_BGR2HSV);
GaussianBlur(HSVimage,HSVimage,Size(7,7),0,0);
inRange(HSVimage,Scalar(0,0,30),Scalar(180,85,255),BinaryImage);
morphologyEx(BinaryImage,BinaryImage,MORPH_OPEN,element);
morphologyEx(BinaryImage,BinaryImage,MORPH_CLOSE,element);
return BinaryImage;
}
/*-------寻找目标几何体的外包围矩形-----*/
void ReadImage_to_SaveBoundingRect(const Mat& Image,vector<Rect>& TemRectangle)
{
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(Image,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
if(!contours.data()) return;
Rect Rectangle;
double MINcontoursArea = 500,MAXcontoursArea = 8000;
for (unsigned int i=0;i<contours.size();i++)
{
if (fabs(contourArea(contours[i]))>MINcontoursArea && fabs(contourArea(contours[i]))<MAXcontoursArea)
{
Rectangle = boundingRect(contours[i]);
/*-----防止矩形越界,出现图像崩溃问题-----*/
if(Rectangle.x >= 5) Rectangle.x = Rectangle.x -5;
if(Rectangle.y >= 12) Rectangle.y = Rectangle.y -12;
if((Rectangle.y+Rectangle.height + 18) >= CalibrationImage.rows) Rectangle.height = Rectangle.height + 18-(Rectangle.y+Rectangle.height + 18- CalibrationImage.rows);
else Rectangle.height = Rectangle.height + 18;
if((Rectangle.x+Rectangle.width + 10) >= CalibrationImage.cols) Rectangle.width = Rectangle.width + 10-(Rectangle.x+Rectangle.width + 10-Calibr
没有合适的资源?快使用搜索试试~ 我知道了~
Opencv_SVM训练_识别几何体
共2065个文件
jpg:1704个
tlog:223个
png:42个
5星 · 超过95%的资源 需积分: 50 54 下载量 181 浏览量
2019-01-13
16:00:08
上传
评论 4
收藏 58.26MB ZIP 举报
温馨提示
该工程基于Opencv2.4.9和Visual Studio2010搭建,下载下来可直接运行。该工程SVM训练的样本也已在文件里面。
资源推荐
资源详情
资源评论
收起资源包目录
Opencv_SVM训练_识别几何体 (2065个子文件)
加载模型实现分类.vcxprojResolveAssemblyReference.cache 713B
SVM识别几何物体.vcxprojResolveAssemblyReference.cache 713B
SVM训练V2.cpp 8KB
main.cpp 7KB
SVM训练.cpp 6KB
main.cpp 5KB
采集训练集图像.cpp 4KB
CameraCalibration.cpp 2KB
CameraCalibration.cpp 2KB
CameraCalibration.cpp 2KB
test.cpp 2KB
main.cpp 814B
main.cpp 127B
加载模型实现分类.exe 104KB
predictShape.exe 102KB
SVM识别几何物体.exe 90KB
负样本采集.exe 69KB
SVM识别几何物体.vcxproj.filters 1KB
加载模型实现分类.vcxproj.filters 1KB
负样本采集.vcxproj.filters 1KB
predictShape.vcxproj.filters 945B
CameraCalibration.h 210B
CameraCalibration.h 210B
CameraCalibration.h 210B
vc100.idb 851KB
vc100.idb 763KB
vc100.idb 603KB
vc120.idb 435KB
加载模型实现分类.ilk 726KB
SVM识别几何物体.ilk 698KB
predictShape.ilk 565KB
负样本采集.ilk 532KB
加载模型实现分类-2adbd344.ipch 54.13MB
svm识别几何物体-e9538004.ipch 54.13MB
负样本采集-ca00ed3b.ipch 54.13MB
1.jpg 55KB
效果图.jpg 54KB
2.jpg 34KB
3.jpg 34KB
4.jpg 34KB
5.jpg 34KB
298.jpg 7KB
299.jpg 6KB
301.jpg 6KB
330.jpg 6KB
329.jpg 6KB
328.jpg 6KB
374.jpg 6KB
375.jpg 6KB
311.jpg 6KB
376.jpg 6KB
302.jpg 6KB
310.jpg 6KB
386.jpg 6KB
319.jpg 6KB
372.jpg 6KB
308.jpg 6KB
377.jpg 6KB
306.jpg 6KB
300.jpg 6KB
387.jpg 6KB
304.jpg 6KB
388.jpg 6KB
305.jpg 6KB
370.jpg 6KB
427.jpg 6KB
371.jpg 6KB
331.jpg 6KB
428.jpg 6KB
373.jpg 6KB
314.jpg 6KB
317.jpg 6KB
318.jpg 6KB
383.jpg 6KB
429.jpg 6KB
425.jpg 6KB
303.jpg 6KB
426.jpg 6KB
313.jpg 6KB
423.jpg 6KB
321.jpg 6KB
312.jpg 6KB
307.jpg 6KB
378.jpg 6KB
82.jpg 6KB
82.jpg 6KB
381.jpg 6KB
369.jpg 6KB
326.jpg 6KB
385.jpg 6KB
320.jpg 6KB
316.jpg 6KB
382.jpg 6KB
309.jpg 6KB
367.jpg 6KB
430.jpg 6KB
325.jpg 6KB
368.jpg 6KB
327.jpg 6KB
322.jpg 6KB
共 2065 条
- 1
- 2
- 3
- 4
- 5
- 6
- 21
资源评论
- SWPU_机器人实验室2019-04-07非常非常好
- bbmiku2021-06-11好用,感谢大佬
scout1996
- 粉丝: 44
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功