目录
分类器
平面线性分类器
超平面推广
什么是SVM
使用SVM
建立训练样本
设置SVM参数
OpenCV的SVM 
分割结果
首页 数据库 mysql教程 【OpenCV2.4】SVM的参数和函数介绍

【OpenCV2.4】SVM的参数和函数介绍

Jun 07, 2016 pm 03:43 PM
http svm 介绍 函数 参数

【原文:http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html】 分类器 分类器是一种计算机程序。 他的设计目标是在通过学习后,可自动将数据分到已知类别。 平面线性分类器 一个简单的分类问题,如图有一些圆圈和一些正方形,如何找一条最优的

【原文:http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html】

分类器

分类器是一种计算机程序。

他的设计目标是在通过学习后,可自动将数据分到已知类别。

平面线性分类器

一个简单的分类问题,如图有一些圆圈和一些正方形,如何找一条最优的直线将他们分开?

【OpenCV2.4】SVM的参数和函数介绍

我们可以找到很多种方法画出这条直线,但怎样的直线才是最优的呢?

距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。 因此我们的目标是找到一条直线,离最近的点距离最远。

怎么寻找距离最远的直线?枚举所有直线,然后计算其样本最小距离?这样显然不是一个好办法,这将产生大量的计算开销。

我们利用另一种方法,对直线的正负偏移量1,这样就产生了一个区域(下图的Maximum margin覆盖的区域),区域边界上的点到直线的距离是固定的,现在的问题是最近的点是否刚好在边界上或者在边界外。

【OpenCV2.4】SVM的参数和函数介绍

还记得点到线的公式么?

对于直线Ax+By+C=0,点(x0, y0)到直线的距离:

  distance = |Ax0+By0+C| / (A2 + B2)1/2

那么区域边缘到直线的距离:

  distance = (|Ax+By+C| + 1)/ (A2 + B2)1/2 = 1/ (A2 + B2)1/2

并需要满足对于所有样本类别y满足:yi (Ax+By+C) > = 1,也就是所有样本都不在该区域以内。

于是我们可以找到适当的A、B、C,从而得到:

  Maximum margin = 2/ (A2 + B2)1/2

超平面推广

同理,我们将这一定理推广到任意维度。其超平面表达式为:

    【OpenCV2.4】SVM的参数和函数介绍

一维是线、二维是面、三维是体……四维呢?五维呢?好吧统称超平面吧……

其中 【OpenCV2.4】SVM的参数和函数介绍 叫做 权重向量 ,  【OpenCV2.4】SVM的参数和函数介绍 叫做 偏置向量。

用这种表达式来表达线Ax+By+C = 0的话,可以这么表示:

    f(x) = (C, 0) + (A, B)T (x, y);

其中(C, 0) 是偏置向量 【OpenCV2.4】SVM的参数和函数介绍,(A, B)是权重向量 【OpenCV2.4】SVM的参数和函数介绍

由于最优超平面可以有很多种表达方式,我们定义:

    ββTx = 0,

为最优超平面表达式。于是我们可以得到他的Maximum margin区域边界表达式应该为:

    【OpenCV2.4】SVM的参数和函数介绍

我们称在这边界上的点为:支持向量(Supper Vector)。

因为点到超平面距离公式为:

    【OpenCV2.4】SVM的参数和函数介绍

在边界上,即支持向量到超平面距离:

    【OpenCV2.4】SVM的参数和函数介绍

所以Maximum margin为两倍距离,即:

    【OpenCV2.4】SVM的参数和函数介绍

M求倒数1/M 则可将求最大转换成求最小。于是有:

    【OpenCV2.4】SVM的参数和函数介绍

其中 【OpenCV2.4】SVM的参数和函数介绍 表示样本的类别标记。

这是一个拉格朗日优化问题,可以通过拉格朗日乘数法得到最优超平面的权重向量 【OpenCV2.4】SVM的参数和函数介绍 和偏置 【OpenCV2.4】SVM的参数和函数介绍 。

什么是SVM

支持向量机 (SVM) 是一个类分类器,正式的定义是一个能够将不同类样本在样本空间分隔的超平面。 换句话说,给定一些标记好的训练样本 (监督式学习),SVM算法输出一个最优化的分隔超平面。

1995年Cortes和Vapnik于首先提出SVM,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

使用SVM

【OpenCV2.4】SVM的参数和函数介绍

#include <opencv2><span>
#include </span><opencv2><span>
#include </span><opencv2>

<span>using</span> <span>namespace</span><span> cv;

</span><span>int</span><span> main()
{
    </span><span>//</span><span> 用于保存可视化数据的矩阵</span>
    <span>int</span> width = <span>512</span>, height = <span>512</span><span>;
    Mat image </span>=<span> Mat::zeros(height, width, CV_8UC3);

    </span><span>//</span><span> 创建一些训练样本</span>
    <span>float</span> labels[<span>4</span>] = {<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span><span>};
    Mat labelsMat(</span><span>3</span>, <span>1</span><span>, CV_32FC1, labels);

    </span><span>float</span> trainingData[<span>4</span>][<span>2</span>] = { {<span>501</span>, <span>10</span>}, {<span>255</span>, <span>10</span>}, {<span>501</span>, <span>255</span>}, {<span>10</span>, <span>501</span><span>} };
    Mat trainingDataMat(</span><span>3</span>, <span>2</span><span>, CV_32FC1, trainingData);

    </span><span>//</span><span> 设置SVM参数</span>
    CvSVMParams <span>params</span><span>;
    </span><span>params</span>.svm_type    =<span> CvSVM::C_SVC;
    </span><span>params</span>.kernel_type =<span> CvSVM::LINEAR;
    </span><span>params</span>.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, <span>100</span>, 1e-<span>6</span><span>);

    </span><span>//</span><span> 对SVM进行训练</span>
<span>    CvSVM SVM;
    SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), </span><span>params</span><span>);
    
    Vec3b green(</span><span>0</span>,<span>255</span>,<span>0</span>), blue (<span>255</span>,<span>0</span>,<span>0</span><span>);
    </span><span>//</span><span> 将SVM断定的分划区域绘制出来</span>
    <span>for</span> (<span>int</span> i = <span>0</span>; i i)
        <span>for</span> (<span>int</span> j = <span>0</span>; j j)
        {
            Mat sampleMat = (Mat_float>(<span>1</span>,<span>2</span>)  i,j);
            <span>float</span> response =<span> SVM.predict(sampleMat);

            </span><span>if</span> (response == <span>1</span><span>)
                image.at</span><vec3b>(j, i)  =<span> green;
            </span><span>else</span> <span>if</span> (response == -<span>1</span><span>) 
                image.at</span><vec3b>(j, i)  =<span> blue;
        }

    </span><span>//</span><span> 绘制训练数据点</span>
    <span>int</span> thickness = -<span>1</span><span>;
    </span><span>int</span> lineType = <span>8</span><span>;
    circle( image, Point(</span><span>501</span>,  <span>10</span>), <span>5</span>, Scalar(  <span>0</span>,   <span>0</span>,   <span>0</span><span>), thickness, lineType);
    circle( image, Point(</span><span>255</span>,  <span>10</span>), <span>5</span>, Scalar(<span>255</span>, <span>255</span>, <span>255</span><span>), thickness, lineType);
    circle( image, Point(</span><span>501</span>, <span>255</span>), <span>5</span>, Scalar(<span>255</span>, <span>255</span>, <span>255</span><span>), thickness, lineType);
    circle( image, Point( </span><span>10</span>, <span>501</span>), <span>5</span>, Scalar(<span>255</span>, <span>255</span>, <span>255</span><span>), thickness, lineType);

    </span><span>//</span><span> 绘制支持向量</span>
    thickness = <span>2</span><span>;
    lineType  </span>= <span>8</span><span>;
    </span><span>int</span> c     =<span> SVM.get_support_vector_count();

    </span><span>for</span> (<span>int</span> i = <span>0</span>; i i)
    {
        <span>const</span> <span>float</span>* v =<span> SVM.get_support_vector(i);
        circle( image,  Point( (</span><span>int</span>) v[<span>0</span>], (<span>int</span>) v[<span>1</span>]),   <span>6</span>,  Scalar(<span>128</span>, <span>128</span>, <span>128</span><span>), thickness, lineType);
    }

    imwrite(</span><span>"</span><span>result.png</span><span>"</span>, image);       
<span>
    imshow(</span><span>"简单SVM分类</span><span>"</span>, image); 
    waitKey(<span>0</span><span>);

}</span></vec3b></vec3b></opencv2></opencv2></opencv2>
登录后复制

【OpenCV2.4】SVM的参数和函数介绍

建立训练样本

这里通过Mat构造函数,建立了一个简单的训练样本。

【OpenCV2.4】SVM的参数和函数介绍

<span>//</span>
<span>float</span> labels[<span>4</span>] = {<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span><span>};
Mat labelsMat(</span><span>3</span>, <span>1</span><span>, CV_32FC1, labels);

</span><span>//</span><span>建立一个训练样本矩阵</span>
<span>float</span> trainingData[<span>4</span>][<span>2</span>] = { {<span>501</span>, <span>10</span>}, {<span>255</span>, <span>10</span>}, {<span>501</span>, <span>255</span>}, {<span>10</span>, <span>501</span><span>} };
Mat trainingDataMat(</span><span>3</span>, <span>2</span>, CV_32FC1, trainingData);
登录后复制

【OpenCV2.4】SVM的参数和函数介绍

由于CvSVM::train 要求样本数据存储在float 类型的Mat中,所以建立了float类型的Mat样本。

设置SVM参数

struct CvSVMParams

SVM 训练参数结构。

该结构必须被初始化后,传给CvSVM。

CvSVMParams::CvSVMParams

构造函数

C++: CvSVMParams::CvSVMParams()
C++: CvSVMParams::CvSVMParams(int svm_type, int kernel_type, double degree, double gamma, double coef0, double Cvalue, double nu, double p, CvMat* class_weights, CvTermCriteria term_crit)
参数
  • svm_type –

    指定SVM的类型,下面是可能的取值:

    • CvSVM::C_SVC C类支持向量分类机。 n类分组  (n 【OpenCV2.4】SVM的参数和函数介绍 2),允许用异常值惩罚因子C进行不完全分类。
    • CvSVM::NU_SVC 【OpenCV2.4】SVM的参数和函数介绍类支持向量分类机。n类似然不完全分类的分类器。参数为 【OpenCV2.4】SVM的参数和函数介绍 取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。
    • CvSVM::ONE_CLASS 单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
    • CvSVM::EPS_SVR 【OpenCV2.4】SVM的参数和函数介绍类支持向量回归机。训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
    • CvSVM::NU_SVR 【OpenCV2.4】SVM的参数和函数介绍类支持向量回归机。 【OpenCV2.4】SVM的参数和函数介绍 代替了 p

    可从 [LibSVM] 获取更多细节。

  • kernel_type –

    SVM的内核类型,下面是可能的取值:

    • CvSVM::LINEAR 线性内核。没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。【OpenCV2.4】SVM的参数和函数介绍.
    • CvSVM::POLY 多项式内核: 【OpenCV2.4】SVM的参数和函数介绍.
    • CvSVM::RBF 基于径向的函数,对于大多数情况都是一个较好的选择: 【OpenCV2.4】SVM的参数和函数介绍.
    • CvSVM::SIGMOID Sigmoid函数内核:【OpenCV2.4】SVM的参数和函数介绍.
  • degree – 内核函数(POLY)的参数degree。
  • gamma – 内核函数(POLY/ RBF/ SIGMOID)的参数【OpenCV2.4】SVM的参数和函数介绍
  • coef0 – 内核函数(POLY/ SIGMOID)的参数coef0
  • Cvalue – SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C
  • nu – SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 【OpenCV2.4】SVM的参数和函数介绍
  • p – SVM类型(EPS_SVR)的参数 【OpenCV2.4】SVM的参数和函数介绍
  • class_weights – C_SVC中的可选权重,赋给指定的类,乘以C以后变成 【OpenCV2.4】SVM的参数和函数介绍。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
  • term_crit – SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。

默认的构造函数初始化有以下值:

【OpenCV2.4】SVM的参数和函数介绍

<span>CvSVMParams::CvSVMParams() :
    svm_type(CvSVM::C_SVC), kernel_type(CvSVM::RBF), degree(</span><span>0</span><span>),
    gamma(</span><span>1</span>), coef0(<span>0</span>), C(<span>1</span>), nu(<span>0</span>), p(<span>0</span>), class_weights(<span>0</span><span>)
{
    term_crit </span>= cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, <span>1000</span><span>, FLT_EPSILON );
}</span>
登录后复制

【OpenCV2.4】SVM的参数和函数介绍

OpenCV的SVM 

class CvSVM

向量支持机

CvSVM::CvSVM

训练构造函数。

C++: CvSVM::CvSVM()
C++: CvSVM::CvSVM(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParamsparams=CvSVMParams() )
C++: CvSVM::CvSVM(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx=0, const CvMat* sampleIdx=0, CvSVMParamsparams=CvSVMParams() )
参数
  • trainData — 训练数据,必须是CV_32FC1 (32位浮点类型,单通道)。数据必须是CV_ROW_SAMPLE的,即特征向量以行来存储。
  • responses — 响应数据,通常是1D向量存储在CV_32SC1 (仅仅用在分类问题上)或者CV_32FC1格式。
  • varIdx — 指定感兴趣的特征。可以是整数(32sC1)向量,例如以0为开始的索引,或者8位(8uC1)的使用的特征或者样本的掩码。用户也可以传入NULL指针,用来表示训练中使用所有变量/样本。
  • sampleIdx — 指定感兴趣的样本。描述同上。
  • params — SVM参数。

CvSVM::train

训练一个SVM。

C++: bool CvSVM::train(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParamsparams=CvSVMParams() )
C++: bool CvSVM::train(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx=0, const CvMat* sampleIdx=0, CvSVMParamsparams=CvSVMParams() )

参数参考构造函数。

CvSVM::train_auto

根据可选参数训练一个SVM。

C++: bool CvSVM::train_auto(const Mat& trainData, const Mat& responses, const Mat& varIdx, const Mat& sampleIdx, CvSVMParamsparams, int k_fold=10, CvParamGrid Cgrid=CvSVM::get_default_grid(CvSVM::C), CvParamGridgammaGrid=CvSVM::get_default_grid(CvSVM::GAMMA), CvParamGrid pGrid=CvSVM::get_default_grid(CvSVM::P), CvParamGridnuGrid=CvSVM::get_default_grid(CvSVM::NU), CvParamGrid coeffGrid=CvSVM::get_default_grid(CvSVM::COEF), CvParamGriddegreeGrid=CvSVM::get_default_grid(CvSVM::DEGREE), bool balanced=false)
C++: bool CvSVM::train_auto(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx, const CvMat* sampleIdx, CvSVMParams params, int kfold=10, CvParamGrid Cgrid=get_default_grid(CvSVM::C), CvParamGrid gammaGrid=get_default_grid(CvSVM::GAMMA), CvParamGrid pGrid=get_default_grid(CvSVM::P), CvParamGrid nuGrid=get_default_grid(CvSVM::NU), CvParamGridcoeffGrid=get_default_grid(CvSVM::COEF), CvParamGrid degreeGrid=get_default_grid(CvSVM::DEGREE), bool balanced=false )
参数
  • k_fold – 交叉验证参数。训练集被分成k_fold的自子集。其中一个子集是用来测试模型,其他子集则成为训练集。所以,SVM算法复杂度是执行k_fold的次数。
  • *Grid – 对应的SVM迭代网格参数。
  • balanced – 如果是true则这是一个2类分类问题。这将会创建更多的平衡交叉验证子集。

这个方法根据CvSVMParams中的最佳参数Cgammapnucoef0degree自动训练SVM模型。参数被认为是最佳的交叉验证,其测试集预估错误最小。

如果没有需要优化的参数,相应的网格步骤应该被设置为小于或等于1的值。例如,为了避免gamma的优化,设置gamma_grid.step = 0,gamma_grid.min_val, gamma_grid.max_val 为任意数值。所以params.gamma 由gamma得出

最后,如果参数优化是必需的,但是相应的网格却不确定,你可能需要调用函数CvSVM::get_default_grid(),创建一个网格。例如,对于gamma,调用CvSVM::get_default_grid(CvSVM::GAMMA)。

该函数为分类运行 (params.svm_type=CvSVM::C_SVC 或者 params.svm_type=CvSVM::NU_SVC) 和为回归运行 (params.svm_type=CvSVM::EPS_SVR 或者 params.svm_type=CvSVM::NU_SVR)效果一样好。如果params.svm_type=CvSVM::ONE_CLASS,没有优化,并指定执行一般的SVM。

CvSVM::predict

预测样本的相应数据。

C++: float CvSVM::predict(const Mat& sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* samples, CvMat* results) const
参数
  • sample – 需要预测的输入样本。
  • samples – 需要预测的输入样本们。
  • returnDFVal – 指定返回值类型。如果值是true,则是一个2类分类问题,该方法返回的决策函数值是边缘的符号距离。
  • results – 相应的样本输出预测的响应。

这个函数用来预测一个新样本的响应数据(response)。在分类问题中,这个函数返回类别编号;在回归问题中,返回函数值。输入的样本必须与传给trainData的训练样本同样大小。如果训练中使用了varIdx参数,一定记住在predict函数中使用跟训练特征一致的特征。

后缀const是说预测不会影响模型的内部状态,所以这个函数可以很安全地从不同的线程调用。

CvSVM::get_default_grid

生成一个SVM网格参数。

C++: CvParamGrid CvSVM::get_default_grid(int param_id)
参数
  • param_id –

    SVM参数的IDs必须是下列中的一个:

    • CvSVM::C
    • CvSVM::GAMMA
    • CvSVM::P
    • CvSVM::NU
    • CvSVM::COEF
    • CvSVM::DEGREE

    网格参数将根据这个ID生成。

CvSVM::get_params

返回当前SVM的参数。

C++: CvSVMParams CvSVM::get_params() const

这个函数主要是在使用CvSVM::train_auto()时去获得最佳参数。

CvSVM::get_support_vector

检索一定数量的支持向量和特定的向量。

C++: int CvSVM::get_support_vector_count() const
C++: const float* CvSVM::get_support_vector(int i) const
参数 i – 指定支持向量的索引。

该方法可以用于检索一组支持向量。

CvSVM::get_var_count

返回变量的个数。

C++: int CvSVM::get_var_count() const

分割结果

  • 程序创建了一张图像,在其中显示了训练样本,其中一个类显示为白色圆圈,另一个类显示为黑色圆圈。
  • 训练得到SVM,并将图像的每一个像素分类。 分类的结果将图像分为蓝绿两部分,中间线就是最优分割超平面。
  • 最后支持向量通过灰色边框加重显示。

【OpenCV2.4】SVM的参数和函数介绍

OpenCV的SVM是基于台湾大学林智仁开发的LIBSVM开发包的。如果你还不过瘾可以看看下面林智仁的演示程序(需要JAVA支持):

   http://www.csie.ntu.edu.tw/~cjlin/libsvm/

在这个实验中,我们成功让机器找到了区分样品的线性划分,并将其支持向量显示出来。

被山寨的原文

Introduction to Support Vector Machines . OpenCV.org

Support Vector Machines API . OpenCV.org

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

golang函数动态创建新函数的技巧 golang函数动态创建新函数的技巧 Apr 25, 2024 pm 02:39 PM

Go语言提供了两种动态函数创建技术:closures和反射。closures允许访问闭包作用域内的变量,而反射可使用FuncOf函数创建新函数。这些技术在自定义HTTP路由器、实现高度可定制的系统和构建可插拔的组件方面非常有用。

C++ 函数命名中参数顺序的考虑 C++ 函数命名中参数顺序的考虑 Apr 24, 2024 pm 04:21 PM

在C++函数命名中,考虑参数顺序至关重要,可提高可读性、减少错误并促进重构。常见的参数顺序约定包括:动作-对象、对象-动作、语义意义和遵循标准库。最佳顺序取决于函数目的、参数类型、潜在混淆和语言惯例。

如何在Java中写出高效和可维护的函数? 如何在Java中写出高效和可维护的函数? Apr 24, 2024 am 11:33 AM

编写高效和可维护的Java函数的关键在于:保持简洁。使用有意义的命名。处理特殊情况。使用适当的可见性。

excel函数公式大全 excel函数公式大全 May 07, 2024 pm 12:04 PM

1、 SUM函数,用于对一列或一组单元格中的数字进行求和,例如:=SUM(A1:J10)。2、AVERAGE函数,用于计算一列或一组单元格中的数字的平均值,例如:=AVERAGE(A1:A10)。3、COUNT函数,用于计算一列或一组单元格中的数字或文本的数量,例如:=COUNT(A1:A10)4、IF函数,用于根据指定的条件进行逻辑判断,并返回相应的结果。

三星S24ai功能详细介绍 三星S24ai功能详细介绍 Jun 24, 2024 am 11:18 AM

2024是AI手机的元年,越来越多的手机集成了多项ai功能,通过ai智能技术的赋能,让我们的手机使用更加高效便捷。近日,年初发布的GalaxyS24系列再度提升了其生成式AI的体验,下面下详细的功能介绍,一起来看看吧。一、生成式AI深度赋能三星GalaxyS24系列通过GalaxyAI的赋能,带来了诸多智能化应用,这些功能与SamsungOneUI6.1深度集成,让用户可以随时获得便利的智能体验,显着提升了手机的使用效率和便捷性。由GalaxyS24系列首创的即圈即搜功能是亮点之一,用户只需长按

如何使用C++实现HTTP流传输? 如何使用C++实现HTTP流传输? May 31, 2024 am 11:06 AM

如何在C++中实现HTTP流传输?使用Boost.Asio和asiohttps客户端库创建SSL流套接字。连接到服务器并发送HTTP请求。接收HTTP响应头并打印它们。接收HTTP响应正文并打印它。

自定义 PHP 函数和预定义函数之间有什么区别? 自定义 PHP 函数和预定义函数之间有什么区别? Apr 22, 2024 pm 02:21 PM

自定义PHP函数与预定义函数的区别在于:作用域:自定义函数仅限于其定义范围,而预定义函数可在整个脚本中访问。定义方式:自定义函数使用function关键字定义,而预定义函数由PHP内核定义。参数传递:自定义函数接收参数,而预定义函数可能不需要参数。扩展性:自定义函数可以根据需要创建,而预定义函数是内置的且无法修改。

C++ 函数异常进阶:定制错误处理 C++ 函数异常进阶:定制错误处理 May 01, 2024 pm 06:39 PM

C++中的异常处理可通过定制异常类增强,提供特定错误消息、上下文信息以及根据错误类型执行自定义操作。定义继承自std::exception的异常类,提供特定的错误信息。使用throw关键字抛出定制异常。在try-catch块中使用dynamic_cast将捕获到的异常转换为定制异常类型。实战案例中,open_file函数抛出FileNotFoundException异常,捕捉并处理该异常可提供更具体的错误消息。

See all articles