我对OpenCV完全陌生,在创建矩阵时遇到麻烦。我阅读了文档,浏览了关于stackoverflow的类似问题,出于对我的爱,我无法弄清楚自己在做错什么。
我正在使用Visual Studio 2017和OpenCV版本4.4.0
我正在尝试创建8x8矩阵并从数组中填充它。尺寸不正确,数据也不正确,因此我尝试使用最小的矩阵进行相同操作,以查看我做错了什么。
所以现在我尝试创建2x2矩阵。很简单,对不对?好吧,不完全是。 这是我使用的代码:
double data[2][2] = { {1.0, 2.0}, {3.0, 4.0} };
double data2[4] = { 1.0, 2.0, 3.0, 4.0 };
Mat *M = new Mat(2, 2, CV_64FC4, data);
我尝试使用二维数组进行操作,尝试使用一维数组进行操作,问题始终相同。 这是我打印矩阵时得到的输出
std::cout << "M = " << *M << std::endl << std::endl;
H = [1, 2, 3, 4, 9.844067014090074e-312, 4.639954332214191e-310, 9.84406421008967e-312, 4.639543499923437e-310;
9.844064273725325e-312, 9.844064194674822e-312, 9.844064050407653e-312, 9.844064042739754e-312, 9.844064050407653e-312, 9.844064050407653e-312, 9.844064050407653e-312, 9.844064050407653e-312]
您可以看到尺寸为2x8,内容为一些随机数。
我也尝试了不使用指针的情况
Mat M(2, 2, CV_64FC4, data);
但是它甚至不能编译,给出错误Expected a type identifier.
我到底在做什么错了?
答案 0 :(得分:2)
有很多适当的方法可以在C ++中初始化cv::Mat
。最简单的是,如果您仅以平面形式显示数据,然后相应地对矩阵进行整形。此示例实际上来自OpenCV文档:
std::vector<Point3f> vec;
...
Mat pointMat = Mat(vec) // convert vector to Mat, O(1) operation
.reshape(1) // make Nx3 1-channel matrix out of Nx1 3-channel.
// Also, an O(1) operation
.t(); // finally, transpose the Nx3 matrix.
// This involves copying all the elements
在您的情况下:
std::vector<double> data = { 1.0, 2.0, 3.0, 4.0 };
Mat ret = Mat(data).reshape(2, 2);
注意:这样,ret
是data
的包装。如果您想复制数据,请使用Mat(data, true)
。
答案 1 :(得分:2)
您尝试使用具有4个通道的CV_64FC4
像素类型,因此每个元素期望4个double
值。要创建每个元素具有单个值的n x m cv::Mat
,请使用CV_64F
类型:
cv::Mat M(n, m, CV_64F, data);