垫子复制到从行到列不起作用!为什么?
Mat copyTo from row to col doesn't work! Why?
这个答案说明如何将一行矩阵复制到另一行:如何将一行Mat复制到OpenCv中的另一个Mat's列?然而,如果我试图复制一行矩阵到列向量的程序是突然结束。例子:
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();
但是如果A
是不同的类型,我怎么能在B
中得到CV_64F
类型呢?数据类型也被复制了吗?最重要的是,为什么我需要这个变通方法?
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>());
由于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还不支持它。
相关文章:
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 为什么二进制搜索在我的测试中不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么这段代码不起作用,我该如何解决?
- 为什么 zlib 放气初始化调用一次不起作用?
- 为什么 ulimit -v 在 Clang 的地址清理器下不起作用?
- 为什么在 while 循环中返回表达式不起作用
- 为什么这些完全相似的代码不起作用?
- 为什么我的数组双精度函数不起作用?
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 以下打印树函数不起作用为什么?
- C++中的dynamic_cast在没有 RTTI 的情况下不起作用;为什么?
- 由于 RPTR->num=30 与 (*rptr).num=30 相同,但是*((*rptr).ptr).name 不起作用为什么?
- 在调试器模式下工作,但在最终版本中不起作用.为什么
- 模组功能不起作用为什么
- CreateProcess在某些计算机上工作,而在其他计算机上不起作用.为什么