cv::Mat 使用数组初始化
Posted
技术标签:
【中文标题】cv::Mat 使用数组初始化【英文标题】:cv::Mat initialization using array 【发布时间】:2017-07-07 08:21:43 【问题描述】:我在初始化之后遇到了一个奇怪的行为
#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;
cout 打印出 [1, 1; 1, 1]。刚刚发生了什么?我在 ubuntu 上使用 eclipse,gcc 版本 5.4,OpenCV 3.2
【问题讨论】:
能否提供minimal reproducible example? 【参考方案1】:您没有使用有效的Mat
构造函数。您有几个选择:
从一个数组:
float pf[] = 1.f, 2.f, 3.f, 4.f ;
Mat1f m1(2, 2, pf);
或
std::vector<float> vf = 1.f, 2.f, 3.f, 4.f ;
Mat1f m2(2, 2, vf.data());
使用逗号初始化器:
Mat1f m3 = (Mat1f(2, 2) << 1.f, 2.f, 3.f, 4.f);
如果矩阵很小,可以使用Matx
:
Matx22f m4(1.f, 2.f, 3.f, 4.f);
请注意,Mat1f
是 Mat_<float>
的 typedef,它是 Mat
类型的 CV_32FC1
。
使用你的方法不起作用,因为1.0, 2.0, 1.0, 0.0
构造cv::Scalar
,所以你调用构造函数Mat(int rows, int cols, int type, cv::Scalar)
。由于您只有 1 个通道,因此矩阵使用此标量的第一个值进行初始化,这是您的初始化列表中的第一个值。
请注意,这只是巧合,因为您的矩阵有 4 个元素(Scalar
s 支持的最大数量)。如果您使用更多的元素:
cv::Mat h(2, 3, CV_32F, 3.f, 2.f, 1.f, 0.f, 2.f, 5.f);
代码不应编译。
【讨论】:
我的方法与你第一次使用数组初始化有什么不同? 补充说明@YuZ以上是关于cv::Mat 使用数组初始化的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 使用 stride 从数组生成 cv::Mat