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

C++ 从OpenCV中的数组创建二维矩阵,c++,opencv,matrix,C++,Opencv,Matrix,我是OpenCV的新手,在创建矩阵时遇到了麻烦。我读了文件,浏览了stackoverflow上类似的问题,看在我的份上,我不知道我做错了什么 我正在使用Visual Studio 2017和OpenCV版本4.4.0 我试图创建一个8x8矩阵,并从数组中填充它。尺寸不正确,数据也不正确,所以我试着用最小的矩阵做同样的事情,看看我做错了什么 现在我尝试创建一个2x2矩阵。很简单,对吧?嗯,不完全是这样。 这是我使用的代码: 双数据[2][2]={{1.0,2.0},{3.0,4.0}; 双数据2[

我是OpenCV的新手,在创建矩阵时遇到了麻烦。我读了文件,浏览了stackoverflow上类似的问题,看在我的份上,我不知道我做错了什么

我正在使用Visual Studio 2017和OpenCV版本4.4.0

我试图创建一个8x8矩阵,并从数组中填充它。尺寸不正确,数据也不正确,所以我试着用最小的矩阵做同样的事情,看看我做错了什么

现在我尝试创建一个2x2矩阵。很简单,对吧?嗯,不完全是这样。 这是我使用的代码:

双数据[2][2]={{1.0,2.0},{3.0,4.0}; 双数据2[4]={1.0,2.0,3.0,4.0}; Mat*M=新Mat2,2,CV_64FC4,数据; 我试着用二维数组,我试着用一维数组,问题总是一样的。 这是我打印矩阵时得到的输出


STD::CUT> P>有很多合适的方法来初始化CV::C++中的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是数据的包装器。如果要复制数据,请使用Matdata,true。

您尝试使用具有4个通道的CV_64FC4像素类型,因此每个元素需要4个双倍值。要创建每个元素具有单个值的n x m cv::Mat,请使用cv_64F类型:


因为像素类型CV_64FC4有4个通道,所以它期望每个像素有4个双倍值。试试简历_64F@pptaszni你给出了答案,而不是评论?@ypnos是的,因为我现在没有环境去尝试。让我们等待OP确认它是否有效,我可以复制它作为答案。这很尴尬。答案和评论都有效。我想这句话更合适一些,因为如果我使用正确的类型,我的解决方案会起作用。@Izak:请小心你所做的。在代码示例中,在堆栈上分配数组。因此,如果它超出范围,您的矩阵内容将被损坏。也许你只在一个函数中使用矩阵,这很好。但是,最好也在堆栈上创建矩阵对象来表示这一点。或者,如果您的数字是固定的,那么也可以在函数中使用静态数组,这非常好。
std::vector<double> data = { 1.0, 2.0, 3.0, 4.0 };
Mat ret = Mat(data).reshape(2, 2);
cv::Mat M(n, m, CV_64F, data);