从OpenCV中的数组创建二维矩阵

时间:2020-08-18 08:51:11

标签: c++ opencv matrix

我对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.

我到底在做什么错了?

2 个答案:

答案 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

Source

在您的情况下:

std::vector<double> data = { 1.0, 2.0, 3.0, 4.0 };
Mat ret = Mat(data).reshape(2, 2);

注意:这样,retdata的包装。如果您想复制数据,请使用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);