300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > opencv c++ svm分类器 初学

opencv c++ svm分类器 初学

时间:2022-08-23 12:15:35

相关推荐

opencv c++ svm分类器 初学

c++ 初学者 + opencv初学者 写了一个简单的svm分类器,由于有很多不是很了解,所以代码注释得比较详细

svm

直接上代码吧 大家将就看

#include "pch.h"#include <iostream>#include <opencv.hpp>using namespace cv;using namespace cv::ml; //svm包含在ml里面int main(){int width = 512, height = 512;Mat image = Mat::zeros(height, width, CV_8UC3);//CV_8UC3 无符号整型数据 3通道占用8位int label[10] = { 1,1,1,1,1,-1,-1,-1,-1,-1 };Mat labelsmat(10, 1, CV_32SC1, label);//CV_32SC1 有符号整型,占用空间32位,单通道float trainingDate[10][2] = { {500,20},{280,500},{300,460},{400,450},{450,400},{20,300},{100,200},{150,100},{200,50},{180,10} };Mat trainingDateMat(10, 2, CV_32FC1, trainingDate);//CV_32FC1 float类型,32位,单通道Ptr<SVM> svm = SVM::create();svm->setType(SVM::C_SVC); //设置分类器类型svm->setKernel(SVM::LINEAR); //设置核函数Ptr<TrainData> tData = TrainData::create(trainingDateMat, ROW_SAMPLE, labelsmat); //第一个为svm->train(tData);Vec3b green(0, 255, 0), red(255, 0, 0); //vec3b vector 3 通道 uchar类型//每一个像素依次进行判断,利用已经训练好的svm,进行分类。for (int i = 0; i < image.rows ; ++i){for (int j = 0; j < image.cols; ++j){Mat sampleMat =(Mat_<float>(1, 2) <<j, i); //因为进行预测的类型必须是mat 所以要先进行转换float response = svm->predict(sampleMat); //预测if (response == 1) //对结果进行分类{image.at<Vec3b>(i, j) = green;}else if (response == -1){image.at<Vec3b>(i, j) == red;}}}Scalar c1 = Scalar::all(0);//全白Scalar c2 = Scalar::all(255); //全黑 或者反过来for (int i = 0; i < labelsmat.rows; i++) //一个一个显示{const float *v = trainingDateMat.ptr<float>(i); //把训练数据的指针头拿出来Point pt = Point((int)v[0], (int)v[1]); //把训练数据放进点类中if (label[i] == 1) //判断{circle(image, pt, 5, c1, -1, 8);}else{circle(image, pt, 5, c2, -1, 8);}}imshow("SVM分类", image);waitKey(0);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。