利用SVM进行图像目标检测和分类
来源:互联网 发布:yy动态头像源码 编辑:程序博客网 时间:2024/06/05 08:40
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include<opencv2/ml/ml.hpp>using namespace cv;using namespace std;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 = "1.png";img = imread(path);img.copyTo(image);if (img.empty()){cout << "Image load error";return 0;}namedWindow(wdname);setMouseCallback(wdname, on_mouse, 0);for (;;){imshow("image", img);int c = waitKey(0);if ((c & 255) == 27){cout << "Exiting ...\n";break;}if ((char)c == 'c'){flag = false;}if ((char)c == 'q'){destroyAllWindows();break;}}svm();return 0;}//鼠标在图像上取样本点,按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>(1, 3) << point[0], point[1], point[2]);if (flag){targetData.push_back(tmp); //加入正样本矩阵circle(img, pt, 2, Scalar(0, 255, 255), -1, 8); //画出点击的点 }else{backData.push_back(tmp); //加入负样本矩阵circle(img, pt, 2, Scalar(255, 0, 0), -1, 8);}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, 1, CV_32S, Scalar::all(1)); //初始化标注for (int i = m; i < m + n; i++)train_label.at<int>(i, 0) = -1;}void svm(){Mat train_data, train_label;getTrainData(train_data, train_label); //获取鼠标选择的样本训练数据CvSVMParams params;params.svm_type = CvSVM::C_SVC;params.kernel_type = CvSVM::LINEAR;params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);// 对SVM进行训练CvSVM SVM;SVM.train(train_data, train_label, Mat(), Mat(), params);Vec3b color(0, 0, 0);// Show the decision regions given by the SVMfor (int i = 0; i < image.rows; ++i)for (int j = 0; j < image.cols; ++j){Vec3b point = img.at<Vec3b>(i, j); //取出该坐标处的像素值Mat sampleMat = (Mat_<float>(1, 3) << point[0], point[1], point[2]);float response = SVM.predict(sampleMat); //进行预测,返回1或-1,返回类型为floatif ((int)response != 1)image.at<Vec3b>(i, j) = color; //将背景设置为黑色}imshow("SVM Simple Example", image);waitKey(0);}
代码如上:
1.首先输入图像,调用setMouseCallback函数进行鼠标取点
2.用鼠标在图像上点击,取出当前点的红绿蓝像素值进行训练。先选择任意个目标样本,然后按"c“键后选择任意个背景样本。样本数可以自己随意决定。样本选择完后,按”q"键完成样本选择。
3.将正负样本矩阵,用vconcat合并成一个矩阵,用作训练分类器,并对相应的样本进行标注。最后将识别出的目标保留,将背景部分调成黑色。
原图:
阅读全文
0 0
- 利用SVM进行图像目标检测和分类
- 在opencv3中利用SVM进行图像目标检测和分类
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- 利用Hog特征和SVM分类器进行行人检测
- [6.837]A1:光线投射法(Ray-Casting)
- 关于SESSION 阻塞问题
- Java正则字符串切割
- jmeter集合点使用方法:Synchronizing Timer
- PG中视图的创建
- 利用SVM进行图像目标检测和分类
- 云服务器tomcat部署问题
- 自动化WiFI钓鱼工具——WiFiPhisher源码解读
- Check if Qcom speaker playback algorithms is removed for opalum speaker tuning
- Generator的基本用法
- 有限状态机设计
- 硅谷企业SaaS服务教父:如何衡量与优化SaaS企业的核心指标
- 静态库与动态库的创建与使用
- java日志文件log4j.properties配置详解