2012-01-12 10 views
9

w OpenCV 2 i później jest metoda Mat::resize, która pozwala ci dodać dowolną liczbę wierszy z domyślną wartością do macierzy, czy istnieje odpowiednia metoda dla kolumny. a jeśli nie, jaki jest najskuteczniejszy sposób na zrobienie tego. DziękiOpenCV Dodaj kolumny do macierzy

+0

miałem wygląd doc online i wydaje się nie mieć funkcję dodawania kolumn. http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html?highlight=mat#Mat::resize –

Odpowiedz

25

Zastosowanie cv::hconcat:

Mat mat; 
Mat cols; 

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

I nie próbuj znajdować dokumentów dla tej funkcji. Jest to nieudokumentowane. –

+1

Kod nagłówka jest tutaj: https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core.hpp#L968. Dla kompletności, pionową konkatinację można wykonać za pomocą 'vconcat()', a także 'cv :: Mat :: push_back()' –

+0

Dokumentacja: http://docs.opencv.org/trunk/d2/de8/group__core__array.html –

3

Najgorszy scenariusz: rotate the image by 90 degrees i użyj Mat::resize(), dzięki czemu kolumny staną się wierszami.

+0

OK, ale to jest najgorszy przypadek, a co jeśli moja mata zawiera CV_64FC1, a rozmiar jest zbyt duży (500 * 500) i muszę to zrobić dla dużej liczby macierzy, więc nie chcę uwzględniać procesu obracania lub transpozycji dwóch tak dużych macierzy w algorytmie. – AMCoded

+5

Jak powiedziałem, ** najgorszy przypadek **. Gdybym znał najlepszy przypadek, podzieliłbym się nim z tobą. – karlphillip

2

Ponieważ OpenCV przechowuje elementy rzędów macierzy kolejno jedna po drugiej, nie ma bezpośredniej metody zwiększania rozmiaru kolumny, ale wychowuję sobie dwa rozwiązania dla powyższej sprawy, Najpierw przy użyciu poniższej metody (kolejność kopiowania elementów jest mniej niż inne metody), możesz również użyć podobnej metody, jeśli chcesz wstawić kilka wierszy lub kolumn, nie na końcu matryc.

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; 
} 

a drugi jeśli nalegają, aby nie obejmować nawet kopiując kolejność danych do algorytmów to lepiej, aby utworzyć macierz z wielkiej liczby wierszy i kolumn i uruchomić algorytm z mniejszym podmatrycy następnie zwiększ swój rozmiar matrycy metodą Mat::adjustROI.

Powiązane problemy