连接 OpenCV Mat 和单个值

Concatenate OpenCV Mat and a single value

我正在使用 OpenCV 3.2。

假设我有一个 3 x 1 垫子:

cv::Mat foo = (cv::Mat_<float>(3,1) << 0, 1, 2);

现在我想将单个值连接到 foo,然后得到结果 4 x 1 Mat.

一个简单的解决方案是:

cv::Mat bar = (cv::Mat_<float>(4,1) << foo.at<float>(0,0),
                                       foo.at<float>(1,0),
                                       foo.at<float>(2,0),
                                       3);

但是这个解决方案过拟合了问题的维度。当然,我可以通过循环 n x 1 Mat 的所有值来概括它,从而得到 n+1 x 1.

我正在寻找的是一个更智能的解决方案,它利用 OpenCV 语法,并直接 returns 单列 Mat 和单个值的串联。

你很幸运。 cv::Mat 提供成员函数 push_back 其中

adds elements to the bottom of the matrix

此外,

The methods add one or more elements to the bottom of the matrix. They emulate the corresponding method of the STL vector class. ...

由于您的 Mat 只有一列,您可以简单地添加标量值,只需确保类型与 Mat 的数据类型相匹配。在你的情况下,你可以直接添加 floats,但是在添加之前你需要明确地转换为 float 的任何其他内容。

如果您有一个只有一行的 Mat,并且想添加一列,这会稍微复杂一些。您需要在 push_back 前后使用 reshape。但是,引用文档

No data is copied. That is, this is an O(1) operation.

如果您需要经常这样做,那么将它包装在一个内联函数中就很简单了。

例子

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    // Adding rows

    cv::Mat foo = (cv::Mat_<float>(3, 1) << 0, 1, 2);
    std::cout << foo << "\n";

    foo.push_back(3.0f);
    std::cout << foo << "\n";

    foo.push_back(static_cast<float>(4)); // Need to make sure the type matches!
    std::cout << foo << "\n";

    // -----

    // Adding columns

    cv::Mat bar = (cv::Mat_<float>(1, 3) << 0, 1, 2);
    std::cout << bar << "\n";

    // push_back needs to add a full row so reshapes are needed (but cheap)
    bar = bar.reshape(1, bar.cols);
    bar.push_back(3.0f);
    bar = bar.reshape(bar.rows);
    std::cout << bar << "\n";

    return 0;
}

控制台输出

[0;
 1;
 2]
[0;
 1;
 2;
 3]
[0;
 1;
 2;
 3;
 4]
[0, 1, 2]
[0, 1, 2, 3]