连接 OpenCV 垫和单个值



我正在使用OpenCV 3.2。

假设我有一个3 x 1垫:

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

现在我想将单个值连接到foo,然后得到一个生成的4 x 1Mat。

一个简单的解决方案是:

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垫的所有值来概括它,从而产生n+1 x 1

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

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

将元素添加到矩阵底部

此外

这些方法将一个或多个元素添加到矩阵的底部。它们模拟 STL 向量类的相应方法。

由于您的Mat只有一列,因此您只需添加标量值,您只需确保类型与Mat的数据类型匹配即可。在这种情况下,您可以直接添加float,但在添加之前需要显式转换为float的任何其他内容。

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

不复制任何数据。也就是说,这是一个 O(1) 操作。

如果您需要经常执行此操作,那么将其包装在内联函数中是微不足道的。

#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]

最新更新