opencv svm 疑问求助

发布于 2021-11-24 20:04:47 字数 3871 浏览 514 评论 1

请教各位大侠:

    我用opencv(3.0版)的SVM进行分类时,svm->(traindata, ROW_SAMPLE, labels)函数进行分类时,traindata的数据格式必须是CV_32FC1,且labels的数据格式为CV_32SC1,换成其他数据格式,则运行错误,这是为什么?此外,数据格式按照上面的要求定义后,为什么使用response=svm->predict(testMat)进行分类时,response的值往往不是预期的类型,而是绝对值很大的整数或负数,如1.07794e+009,跪求解答。全部代码如下所示:

#include <string.h>

#include<string>

#include<iostream>

#include<opencv2/ml.hpp>

#include <opencv2/core/core.hpp> 

using namespace std;

using namespace cv;

using namespace cv::ml;

int main(){

        // step 1:  

        //训练数据的分类标记,即4类

        float labels[16] = { 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0 };

        Mat labelsMat = Mat(16, 1, CV_32SC1, labels);

        //训练数据矩阵

        float trainingData[16][2] = { { 0, 0 }, { 4, 1 }, { 4, 5 }, { -1, 6 }, { 3, 11 }, { -2, 10 }, { 4, 30 }, { 0, 25 }, { 10, 13 }, { 15, 12 }, { 25, 40 }, { 11, 35 }, { 8, 1 }, { 9, 6 }, { 15, 5 }, { 20, -1 } };

        Mat trainingDataMat = Mat(16, 2, CV_32FC1, trainingData);

        //------------设置支持向量机的参数---------------------

        // opencv3.0 

        Ptr<ml::SVM> svm = ml::SVM::create();

        svm->setType(SVM::C_SVC);

        svm->setKernel(SVM::RBF);

        svm->setC(100);

        svm->setGamma(1);

        svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)1e7, 1e-6));//终止准则函数:当迭代次数达到最大值时终止 

        // -----训练-------

        printf("n-----------------starting to train data by SVM----------------n"

;

        svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);

        // step 4:  

        //使用训练所得模型对新样本进行分类测试

        for (int i = -5; i<15; i++)

        {

                for (int j = -5; j<15; j++)

                {

                        float a[] = { i, j };

                        Mat sampleMat = Mat(1, 2, CV_32FC1, a);

                        cout << "sampleMat = " << sampleMat << endl;

                        float response = svm->predict(sampleMat);

                        cout << response << " ";

                }

                cout << endl;

        }

        return 0;

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无法言说的痛 2021-12-01 11:27:31

这个例子是opencv自带的吗?可能opencv实现的SVM目前支持2类分类情况。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文