【opencv】教程代码 —ml (主成分分析、支持向量机、非线性支持向量机)

 1. introduction_to_pca.cpp  主成分分析

f413a9b3dcae27dd0c4b4a9ae2bc7e13.png

a8c24e187bf9bdc621952a8f113a27ea.png

811132a96e6e9d6b190226f44e70dd2b.png

/**
 * @file introduction_to_pca.cpp
 * @brief 这个程序演示了如何使用OpenCV PCA 提取物体的方向
 * @author OpenCV团队
 */


// 包含OpenCV函数库所需要的头文件
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream> // 包含输入输出流的头文件


// 使用std和cv的命名空间,这样我们就可以直接使用它们提供的方法,不用每次都写std::和cv::
using namespace std;
using namespace cv;


// 函数声明
void drawAxis(Mat&, Point, Point, Scalar, const float);
double getOrientation(const vector<Point> &, Mat&);


/**
 * @function drawAxis
 * @brief 绘制轴线的函数
 */
void drawAxis(Mat& img, Point p, Point q, Scalar colour, const float scale = 0.2)
{
    //! [visualization1]
    // 计算以弧度为单位的角度
    double angle = atan2((double)p.y - q.y, (double)p.x - q.x); // p到q的线段角度


    // 计算p和q之间的直线的长度
    double hypotenuse = sqrt((double)(p.y - q.y) * (p.y - q.y) + (p.x - q.x) * (p.x - q.x));


    // 这里通过缩放因子来延长线段的长度
    q.x = (int)(p.x - scale * hypotenuse * cos(angle)); // 计算新的q点的x坐标
    q.y = (int)(p.y - scale * hypotenuse * sin(angle)); // 计算新的q点的y坐标


    // 绘制p点到新q点的直线,这是主线段
    line(img, p, q, colour, 1, LINE_AA);


    // 创建箭头的勾
    // 根据箭头角度计算箭头勾的端点,并绘制箭头勾的第一部分
    p.x = (int)(q.x + 9 * cos(angle + CV_PI / 4)); // 计算箭头勾的一个端点的x坐标
    p.y = (int)(q.y + 9 * sin(angle + CV_PI / 4)); // 计算箭头勾的一个端点的y坐标
    line(img, p, q, colour, 1, LINE_AA); // 绘制箭头勾的第一部分


    // 绘制箭头勾的第二部分
    p.x = (int)(q.x + 9 * cos(angle - CV_PI / 4)); // 计算箭头勾的另一个端点的x坐标
    p.y = (int)(q.y + 9 * sin(angle - CV_PI / 4)); // 计算箭头勾的另一个端点的y坐标
    line(img, p, q, colour, 1, LINE_AA); // 绘制箭头勾的第二部分
    //! [visualization1]
}


/**
 * @function getOrientation
 * @brief 获取方向的函数
 */
double getOrientation(const vector<Point> &pts, Mat &img)
{
    //! [pca]
    // 构造PCA分析使用的数据缓冲区, 每个点的x和y坐标为一行
    int sz = static_cast<int>(pts.size()); // 获取点集的大小
    Mat data_pts = Mat(sz, 2, CV_64F); // 创建Mat对象用于存储点坐标
    for (int i = 0; i < data_pts.rows; i++) // 遍历所有点
    {
        data_pts.at<double>(i, 0) = pts[i].x; // 将点的x坐标放入Mat对象
        data_pts.at<double>(i, 1) = pts[i].y; // 将点的y坐标放入Mat对象
    }


    // 执行PCA分析
    PCA pca_analysis(data_pts, Mat(), PCA::DATA_AS_ROW); // 使用点集进行PCA分析


    // 获取物体的中心点
    Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(0, 0)), // 计算平均值点的x坐标
                      static_cast<int>(pca_analysis.mean.at<double>(0, 1))); // 计算平均值点的y坐标


    // 储存特征值和特征向量
    vector<Point2d> eigen_vecs(2); // 创建存储特征向量的向量
    vector<double> eigen_val(2); // 创建存储特征值的向量
    for (int i = 0; i < 2; i++) // 只考虑x和y坐标,因此遍历两个维度
    {
        eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), // 获取第i个特征向量的x分量
                                pca_analysis.eigenvectors.at<double>(i, 1)); // 获取第i个特征向量的y分量


        eigen_val[i] = pca_analysis.eigenvalues.at<
### 回答1: OpenCV是一个开放源代码的图像处理库,也支持机器学习和模式识别等领域的算法。其中包括支持向量机(Support Vector Machine, SVM)算法,可以用于非线性回归任务。 支持向量机是一种常见的机器学习算法,可以用于分类和回归问题。在回归任务中,支持向量机可以用于建立非线性回归模型。 OpenCV中的支持向量机非线性回归主要基于核函数方法。核函数可以将非线性问题转化为高维空间中的线性问题,这样就可以使用线性回归模型进行建模。OpenCV提供了多种核函数供选择,如线性核函数、多项式核函数和径向基函数(Radial Basis Function, RBF)核函数等。 使用OpenCV进行支持向量机非线性回归的步骤大致如下: 1. 收集回归数据集,并根据需求进行预处理,如数据归一化。 2. 创建一个支持向量机模型对象,通过设置相关参数,如核函数类型、惩罚因子等,来进行模型配置。 3. 使用训练数据集训练支持向量机模型。 4. 使用训练好的模型进行预测,得到回归结果。 5. 根据需要,可以对模型进行进一步优化、调参等。 通过OpenCV支持向量机非线性回归功能,我们可以在处理非线性回归问题时,利用支持向量机算法建立准确性较高的模型。这样可以对各种复杂的非线性数据进行准确的回归预测,并能适应不同的核函数和其它参数配置的需求。 ### 回答2: OpenCV库是一种广泛使用的开源计算机视觉和机器学习库,其中包括了支持向量机(SVM)算法,可以用于非线性回归。 支持向量机是一种监督学习模型,用于分类和回归问题。在线性回归问题中,我们试图找到最佳的直线或平面来拟合数据。然而,在某些情况下,数据可能无法线性分割,这就需要使用非线性回归算法,如支持向量机OpenCV中的支持向量机实现的一个关键概念是核函数。核函数可以将数据从输入空间(原始特征空间)映射到一个更高维的特征空间,这样可以使数据在更高维度的空间中变得线性可分。OpenCV提供了多个核函数选项,如径向基函数(RBF)核、多项式核等,这些核函数可以根据问题的要求进行选择。 在使用OpenCV进行非线性回归时,我们首先需要准备训练数据和测试数据。然后,我们可以选择适当的核函数,并通过调整一些参数(如核函数的参数、惩罚因子等)来训练支持向量机模型。训练完成后,我们可以使用模型来预测新的数据样本。 总之,OpenCV库提供了支持向量机算法的实现,以解决非线性回归问题。通过选择适当的核函数和调整参数,可以构建一个准确的非线性回归模型,从而在计算机视觉和机器学习任务中提供更好的性能和结果。 ### 回答3: OpenCV是一个广泛应用于计算机视觉和图像处理领域的开源库。它不仅支持常见的图像处理功能,还包括机器学习算法。其中,OpenCV也提供了对支持向量机(Support Vector Machine,SVM)的支持,包括非线性回归。 支持向量机是一种常用的机器学习算法,旨在通过寻找最优的超平面,将数据点划分成不同的类别。在线性回归中,SVM可以用于从给定的数据集中预测一个连续性的输出变量。然而,有时候数据集并不是线性可分的,这时就需要通过非线性回归来解决这个问题。 在OpenCV中,支持向量机非线性回归通过使用内核函数来实现。内核函数的作用是将训练数据从原始特征空间映射到更高维的特征空间,使得数据在新的空间中能够线性可分。常见的内核函数包括多项式函数、径向基函数和Sigmoid函数等。 使用OpenCV进行支持向量机非线性回归的步骤主要有以下几个: 1. 准备训练数据集,包括输入变量X和输出变量y。 2. 创建一个SVM对象,并设置相关参数,如内核函数和惩罚参数等。 3. 调用SVM对象的训练方法,输入训练数据集,训练出一个SVM模型。 4. 对新的输入数据进行预测,可以使用SVM对象的predict方法,得到相应的输出结果。 总之,OpenCV支持向量机非线性回归提供了一种有效的工具来处理非线性可分的数据集。通过选择合适的内核函数和参数设置,可以在计算机视觉和图像处理等领域中应用SVM算法,实现准确的预测和分类任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值