C ++ Opencv:Mat.zeros形状错误

问题描述 投票:1回答:2

我使用Mat定义并初始化了一个Mat::zeros变量,当我打印它的形状,即rowscolschannels时,我似乎得到了错误的值。

我的代码如下所示:

#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[])
{
    int n_Channel = 3;
    int mySizes[3] = {100, 200, n_Channel};
    Mat M = Mat::zeros(n_Channel, mySizes, CV_64F);
    cout << M.rows << "," << M.cols << "," << M.channels() << endl;
    return 0;
}

打印的消息是:

-1,-1,1

这有什么问题?

我还发现,如果我使用以下代码声明Mat

int n_Channel = 3;
Mat M(Size(100, 200), CV_32FC(n_Channel));
cout << M.rows << "," << M.cols << "," << M.channels() << endl;

结果是正确的:

200,100,3

我对此感到困惑。谢谢大家的帮助!

c++ opencv
2个回答
2
投票

你想使用overloaded version方法的非常特殊的cv::Mat::zeros

我们来看看下面的代码:

    // Number of channels.
    const int n_Channel = 3;

    // Number of dimensions; must be 1 or 2?
    const int n_Dimensions = 2;

    // Create empty Mat using zeros, and output dimensions.
    int mySizes[n_Dimensions] = { 200, 100 };
    cv::Mat M1 = cv::Mat::zeros(n_Dimensions, mySizes, CV_64FC(n_Channel));
    std::cout << "M1: " << M1.rows << "," << M1.cols << "," << M1.channels() << std::endl;

    // Create empty Mat using constructor, and output dimensions.
    cv::Mat M2 = cv::Mat(cv::Size(100, 200), CV_64FC(n_Channel), cv::Scalar(0, 0, 0));
    std::cout << "M2: " << M2.rows << "," << M2.cols << "," << M2.channels() << std::endl;

它给出了以下输出:

M1: 200,100,3
M2: 200,100,3

所以,基本上你必须将“频道号信息”从mySizes移动到cv::Mat::zeros方法。此外,您必须注意mySizes中提供的图像尺寸的顺序,因为它似乎与使用cv::Size的构造函数不同。我猜后者是width x height,而第一个是number of rows x number of cols


0
投票

如何初始化CV垫:

cv::Mat test = cv::Mat::zeros(cv::Size(100, 200), CV_64F);

如您所见,第一个参数是Size cf:

https://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html

© www.soinside.com 2019 - 2024. All rights reserved.