CV ::使用阵列
问题描述:
垫初始化我经历例如通过CV ::使用阵列
#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]。 WTF刚刚发生?我在ubuntu上使用eclipse,gcc版本5.4,OpenCV 3.2
答
您没有使用有效的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,这是CV_32FC1
类型的Mat
。
用你的方法,因为{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});
代码不应该编译。
您能否提供[MCVE]? – Jonas