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 循环的行列索引

打印 cv::Mat opencv

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

从 cv mat 中删除行或列的最佳方法是啥

处理 cv::MAT 的像素不起作用

OpenCV用另一个值替换特定像素值