2011-08-09 13 views
13

Chcę skopiować wiersze 0, 2 i 4 z mojej macierzy A do B, w tej kolejności. Niech A = [a0, a1, a2, a3, a4]^T, z a_i będącymi wektorami wierszowymi, , a następnie B powinno być: [a0, a2, a4]^T.Skopiuj wybrane wiersze do nowej macierzy

Poniższy kod robi to, co chcę, ale zastanawiam się, czy istnieje ładniejsze rozwiązanie (może używając Eigen)?

#include <iostream> 
#include <vector> 
#include <opencv/cv.h> 


int main(int argc, char **argv) { 
    const int num_points = 5; 
    const int vec_length = 3; 
    cv::Mat A(num_points, vec_length, CV_32FC1); 
    cv::RNG rng(0); // Fill A with random values 
    rng.fill(A, cv::RNG::UNIFORM, 0, 1); 
// HACK Ugly way to fill that matrix . 
    cv::Mat B = cv::Mat(3,vec_length, CV_32FC1); 
    cv::Mat tmp0 = B(cv::Rect(0,0,vec_length,1)); 
    cv::Mat tmp1 = B(cv::Rect(0,1,vec_length,1)); 
    cv::Mat tmp2 = B(cv::Rect(0,2,vec_length,1)); 
    A.row(0).copyTo(tmp0); 
    A.row(2).copyTo(tmp1); 
    A.row(4).copyTo(tmp2); 

    std::cout << "A: " << A << std::endl; 
    std::cout << "B: " << B << std::endl; 
    return 0; 
} 

Odpowiedz

17

Znalazłem push_back.

Tworzenie B z size 0 x vec_length a następnie użyć push_back aby dodać wybrane wiersze z A:

#include <iostream> 
#include <vector> 
#include <opencv/cv.h> 


int main(int argc, char **argv) { 
    const int num_points = 5; 
    const int vec_length = 3; 
    cv::Mat A(num_points, vec_length, CV_32FC1); 
    cv::RNG rng(0); // Fill A with random values 
    rng.fill(A, cv::RNG::UNIFORM, 0, 1); 
    cv::Mat B = cv::Mat(0,vec_length, CV_32FC1); 
    B.push_back(A.row(0)); 
    B.push_back(A.row(2)); 
    B.push_back(A.row(4)); 
    std::cout << "A: " << A << std::endl; 
    std::cout << "B: " << B << std::endl; 
    return 0; 
} 
+0

to jest niesamowite! Traktowanie cv :: Mat jako wektorów! Dzięki nowemu API C++. – garak

1

Ponieważ nie sąsiadują ze sobą, nie sądzę, że istnieje skrót. W tym szczególnym przypadku możesz zrobić kod czystszy z pętlą:

for (int i=0; i<3; i++) { 
    cv::Mat tmp = B(cv::Rect(0,i,vec_length,1)); 
    A.row(i * 2).copyTo(tmp); 
} 
+0

Ok, ale w moim Przypadek, że skrót nie działa, ponieważ używam różnych wartości niż (0,2,4). Dzięki i tak! – Unapiedra

+0

W zależności od okoliczności może uda Ci się zbudować wektor duplesów źródłowych i docelowych. Możesz użyć podobnej pętli, która przebiega przez wektor i kopiuje wiersz źródłowy do wiersza docelowego. Powodzenia! – SSteve

23

Sposób, w OpenCV 2.4.1 jest:

A.row(0).copyTo(B.row(0)); 
A.row(2).copyTo(B.row(1)); 
A.row(4).copyTo(B.row(2)); 
0
Mat row = old.row(0); 
old.row(0).copyTo(row); 
new.push_back(row); 
Powiązane problemy