cv ::使用数组进行Mat初始化

YuZ*_*YuZ 1 c++ arrays opencv mat

在经过初始化之后,我经历了一种奇怪的行为

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

int main() {
    cv::Mat h = cv::Mat(2, 2, CV_32F, {1.0, 2.0, 1.0, 0.0});
    std::cout << h << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

cout打印出来[1,1; 1,1].WTF刚刚发生?我在ubuntu上使用eclipse,gcc版本5.4,OpenCV 3.2

Mik*_*iki 6

您没有使用有效的Mat构造函数.你有几个选择:

  1. 从数组:

    float pf[] = { 1.f, 2.f, 3.f, 4.f };
    Mat1f m1(2, 2, pf);
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    std::vector<float> vf = { 1.f, 2.f, 3.f, 4.f };
    Mat1f m2(2, 2, vf.data());
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用逗号初始值设定项:

    Mat1f m3 = (Mat1f(2, 2) << 1.f, 2.f, 3.f, 4.f);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果矩阵很小,您可以使用Matx:

    Matx22f m4(1.f, 2.f, 3.f, 4.f);
    
    Run Code Online (Sandbox Code Playgroud)

请注意,a Mat1f是typedef Mat_<float>,是一种Mat类型CV_32FC1.


使用您的方法不起作用,因为{1.0, 2.0, 1.0, 0.0}构造 cv::Scalar,所以你调用构造函数Mat(int rows, int cols, int type, cv::Scalar).由于您只有1个通道,因此使用此标量的第一个值初始化矩阵,这是初始化列表中的第一个值.

请注意,这只是一个巧合,因为您的矩阵有4个元素(Scalars 支持的最大数量).如果您使用更多数量的元素:

cv::Mat h(2, 3, CV_32F, {3.f, 2.f, 1.f, 0.f, 2.f, 5.f});
Run Code Online (Sandbox Code Playgroud)

代码不应该编译.