我正在使用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
垫的所有值来概括它,从而产生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]