cv::Mat 使用行数据填充一个新的 Mats 列
Posted
技术标签:
【中文标题】cv::Mat 使用行数据填充一个新的 Mats 列【英文标题】:cv::Mat use row data to fill a new Mats columns 【发布时间】:2015-05-29 07:57:20 【问题描述】:我有一个函数,它返回一个 4 行 1 列的 opencv Mat。它在 for 循环中运行,迭代 2 到 100 次。
我需要的是,将返回的列复制到一个新的 Mat 中,这样每次迭代都会添加一个新列。
我有(伪):
cv::Mat ResultMat(4, 1, CV_64F);
Mat returnMat(4, 1, CV_64F);
for (int i = 0; i < iterations; i++)
returnMat= (function that returns a 4x1 Mat);
returnMat.col(0).copyTo(ResultMat.col(0));
效果很好,但每次都会覆盖 Resultmat 列。
用
替换最后一行returnMat.col(0).copyTo(ResultMat.col(i));
导致异常错误。
编辑:如果我将 ResultMat 创建为“Resultmat(4, 100, CV_64F)”,它可以工作,但我需要它自行调整列数...
如何动态地将列添加到 ResultMat,每个循环一个?
【问题讨论】:
不要使用return
作为变量名!
抱歉,这只是伪代码!为了清楚起见,我会更改它。
hconcat 用于动态方法
@Ben 的迭代次数不等于 ResultMat 所需的列数吗?
您好,迭代次数会改变。我真的希望生成的垫子中的列能够反映数字。谢谢!
【参考方案1】:
不知道为什么当您更改 ResultMat 的大小时它对您不起作用。但这是一个解决方案,因为您知道迭代次数,这基本上是最终结果中的列数。 我定义了一个函数 func() 来演示循环内部调用的函数。
Mat func()
Mat m(4, 1, CV_64F);
randn(m, 0., 1.); // fill with random values.
return m;
int main()
int iterations = 3;
cv::Mat result(4, iterations, CV_64F);
for (int i = 0; i < iterations; i++)
Mat m = func();
m.col(0).copyTo(result.col(i));
return 0;
【讨论】:
如果没有。迭代次数与否不同。对于 ResultMat 的预期列,我建议按照 berak 的建议使用 hconcat 或 push_back 然后转置(对于非常大的矩阵来说不是很好)。请参阅问题下方 berak 的评论。 这将起作用,如上所述。 cv::Mat 结果(4,迭代,CV_64F);我早该想到的!非常感谢。 您也可以使用cv::Mat::push_back(...)
,即在末尾添加一行,完成添加行后,将其转置(使用cv::Mat::t()
)以获得所需的形式以上是关于cv::Mat 使用行数据填充一个新的 Mats 列的主要内容,如果未能解决你的问题,请参考以下文章
两通道 cv::Mat 对象填充了没有 for 循环的行列索引