C++;关于opencv3 我对C++不太好,但我开始学习了。我通过看别人的代码来学习

C++;关于opencv3 我对C++不太好,但我开始学习了。我通过看别人的代码来学习,c++,opencv,C++,Opencv,我正在看Opencv上的SVM教程 我不明白上面的部分 (Mat_(1,2) >代码>(C++中的Mat1(1,2)名称可以有尾部下划线。“Mati”是函数的普通名称。在这种情况下,Mati与垫子类有关,但不相同。它用于创建类型的矩阵,同时指定其特征。 在这种特殊情况下,sampleMat对象将有1列和2行,因此它看起来像一个维度为2的向量,并且将为其指定值(j,i) 更具体地说: Mat是函数的名称 是一种模板类型,用于指定矩阵将包含何种类型的元素 (1,2)是初始化参数,用于创建一列两行

我正在看Opencv上的SVM教程

我不明白上面的部分

(Mat_(1,2)
>代码>(C++中的Mat1(1,2)名称可以有尾部下划线。“Mati”是函数的普通名称。在这种情况下,Mati与垫子类有关,但不相同。它用于创建类型的矩阵,同时指定其特征。

在这种特殊情况下,sampleMat对象将有1列和2行,因此它看起来像一个维度为2的向量,并且将为其指定值(j,i)

更具体地说:

  • Mat
    是函数的名称
  • 是一种模板类型,用于指定矩阵将包含何种类型的元素
  • (1,2)
    是初始化参数,用于创建一列两行的矩阵

  • 好的,我知道它正在创建一个1x2矩阵,但我仍然不明白为什么它应该是j和i,而不是i和j。OpenCV使用顺序
    i
    -
    j
    。笛卡尔坐标使用顺序
    j
    -
    i
    。这只是一种约定。它不仅仅是OpenCV。矩阵通常通过行、列访问
     // Show the decision regions given by the 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) << j,i);
             float response = svm->predict(sampleMat);
             if (response == 1)
                 image.at<Vec3b>(i,j)  = green;
             else if (response == -1)
                 image.at<Vec3b>(i,j)  = blue;
         }