2012-01-12 114 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方法增加矩陣大小。