Mat copy从行到col不起作用!为什么?

时间:2014-05-12 16:05:31

标签: c++ opencv

此答案说明如何将矩阵的行复制到另一行:How to copy a row of a Mat to another Mat's column in OpenCv? 但是,如果我尝试将一行矩阵复制到列向量,则程序会突然结束。 例如:

Mat A(640,480,CV_64F);
Mat B(480,1,CV_64F);
A.row(0).copyTo(B.col(0));

可能的解决方法是:

Mat A(640,480,CV_64F);
Mat B;
A.row(0).copyTo(B);
B = B.t();

但如果CV_64F是另一种类型,我怎样才能在B中获得A类型?数据类型也被复制了吗?而且 - 最重要的是 - 为什么我需要这个解决方法?

2 个答案:

答案 0 :(得分:3)

由于API不支持以下代码(仅转置行):

A.row(0).t().copyTo( B.col(0) );

解决方法是从行创建临时矩阵,转置它,然后复制到目标矩阵

Mat temp = A.row(0);
temp = temp.t();
temp.copyTo( B.col(0) );

我宁愿做这样的事情:

Mat A( 640, 480,CV_64F );
Mat B( 1, 480, CV_64F );  /* rather than 480 x 1, make a 1 x 480 first */
A.row(0).copyTo( B.row(0) );
B = B.t(); /* transpose it afterwards */

我认为这只是因为API还没有支持它。

答案 1 :(得分:3)

copyTo()函数只能复制相同大小(宽度和高度)和相同类型的矩阵之间的数据。因此,您无法直接使用它将矩阵行复制到矩阵列。通常,OpenCV将重新分配目标矩阵,使其大小和类型与原始图像匹配,但调用col()函数会返回无法重新分配的常量临时对象。结果你的节目粉碎了。

实际上这个问题可以解决。您可以将行复制到列(如果它们具有相同数量的元素),您可以在不同类型的矩阵之间复制数据。 Mat为其数据提供了一个迭代器,这意味着您可以使用所有与迭代器一起使用的C ++函数。例如copy()函数。

Mat A(640, 480, CV_64F);
Mat B(480, 1, CV_32S); // note that the type don't have to be the same
Mat tmp = A.row(0); // no data is copied here. it is needed only because taking iterator to temporary object is really bad idea
copy(tmp.begin<double>(), tmp.end<double>(), B.begin<int>());