SVM(1)OpenCV实现

本文介绍了一个使用支持向量机(SVM)进行图像区域分类的实际案例。通过初始化图像并定义训练数据,包括四个样本点及其标签,实现了基于线性核的支持向量机模型训练,并将训练结果应用于图像上,对每个像素进行预测并根据预测结果绘制不同颜色。


初始化数据

 
    int width = 512, height = 512;  
    Mat image = Mat::zeros(height, width, CV_8UC3);  
设置训练数据
    float labels[4] = {1.0, -1.0, -1.0, -1.0};  
    Mat labelsMat(4, 1, CV_32FC1, labels);  
  
    float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };  
    Mat trainingDataMat(4, 2, CV_32FC1, trainingData);  
SVM初始化
    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(trainingDataMat, labelsMat, Mat(), Mat(), params);  
SVM结果显示
Vec3b green(0,255,0), blue (255,0,0);  
    for (int i = 0; i < image.rows; ++i)  
        for (int j = 0; j < image.cols; ++j)  
        {  
            Mat sampleMat = (Mat_<float>(1,2) << i,j);  
            float response = SVM.predict(sampleMat);  
  
            if (response == 1)  
                image.at<Vec3b>(j, i)  = green;  
            else if (response == -1)  
                 image.at<Vec3b>(j, i)  = blue;  
        }  
  
    // Show the training data   
    int thickness = -1;  
    int lineType = 8;  
    circle( image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);  
    circle( image, Point(255,  10), 5, Scalar(255, 255, 255), thickness, lineType);  
    circle( image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);  
    circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);  




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值