2012-01-12 310 views
9

在OpenCV 2和更高版本中有方法Mat::resize让我们添加任意数量的行与默认值到您的矩阵是否有任何等效的列的方法。如果不是最有效的方法是什么。 谢谢OpenCV在矩阵中添加列

+0

我看看联机文档,似乎不必添加列的功能。 http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html?highlight=mat#Mat::resize – 2012-01-13 08:27:50

回答

25

使用cv::hconcat

Mat mat; 
Mat cols; 

cv::hconcat(mat, cols, mat); 
+4

并且不要尝试查找此功能的文档。它是无证的。 – 2014-10-13 13:37:11

+1

标题代码在这里:https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core.hpp#L968。为了完整性,可以使用'vconcat()'和'cv :: Mat :: push_back()'完成垂直连接。 – 2015-01-29 10:43:43

+0

文档:http://docs.opencv.org/trunk/d2/de8/group__core__array.html – 2016-09-14 21:30:59

3

最坏的情况:rotate the image by 90 degrees和使用Mat::resize(),使列成为行。

+0

好吧,但那是最坏的情况,如果我的垫包含CV_64FC1和大小太大(500 * 500),我必须为此提供大量的矩阵,所以我不想在算法中包含旋转或转置两次这样的大矩阵的过程。 – AMCoded 2012-01-13 07:27:00

+5

正如我所说,**最坏的情况**。如果我知道最好的情况,我会分享给你。 – karlphillip 2012-01-13 11:19:34

2

由于OpenCV,一个接一个地存储矩阵行的元素,没有直接的方法来增加列的大小,但我提出了自己两个解决方案的上述问题, 首先使用以下方法(复制元素的顺序是比其他方法要少),如果你想在矩阵的末尾插入一些行或列,而不是专门的话,你也可以使用类似的方法。

void resizeCol(Mat& m, size_t sz, const Scalar& s) 
{ 
    Mat tm(m.rows, m.cols + sz, m.type()); 
    tm.setTo(s); 
    m.copyTo(tm(Rect(Point(0, 0), m.size()))); 
    m = tm; 
} 

而另外一个,如果你坚持不包括甚至复制数据的顺序为您的算法,那么最好是与大的行数和列的创建你的矩阵,并开始用更小的子矩阵算法则通过Mat::adjustROI方法增加矩阵大小。