我使用Mat
定义并初始化了一个Mat::zeros
变量,当我打印它的形状,即rows
,cols
,channels
时,我似乎得到了错误的值。
我的代码如下所示:
#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
我对此感到困惑。谢谢大家的帮助!
你想使用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
。
如何初始化CV垫:
cv::Mat test = cv::Mat::zeros(cv::Size(100, 200), CV_64F);
如您所见,第一个参数是Size cf: