2011-08-09 15 views
13

में पंक्तियों का चयन करें, मैं इस क्रम में अपने मैट्रिक्स ए में बी की पंक्तियों 0, 2 और 4 की प्रतिलिपि बनाना चाहता हूं। चलो ए = [ए0, ए 1, ए 2, ए 3, ए 4]^टी, ए_आई पंक्ति-वैक्टर होने के साथ, तो बी होना चाहिए: [ए0, ए 2, ए 4]^टी।नई मैट्रिक्स

नीचे दिया गया कोड जो चाहता है वह करता है लेकिन मुझे आश्चर्य है कि क्या एक सुंदर समाधान है (शायद ईजिन का उपयोग कर रहा है)?

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

उत्तर

17

मैं push_back पाया।

size 0 x vec_length साथ B बनाएं और फिर push_back का उपयोग 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

यह कमाल है! सीवी :: मैट वैक्टर के रूप में इलाज! नए सी ++ एपीआई के लिए धन्यवाद। – garak

1

चूंकि वे गैर-संगत नहीं हैं, मुझे नहीं लगता कि कोई शॉर्टकट है। इस विशेष मामले में आप एक पाश के साथ कोड क्लीनर कर सकता है:

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

ठीक है, लेकिन में मेरी मामला कि शॉर्टकट काम नहीं करता है क्योंकि मैं अलग-अलग मानों का उपयोग कर रहा हूं (0,2,4)। फिर भी धन्यवाद! – Unapiedra

+0

आपके परिस्थिति के आधार पर, शायद आप स्रोत और गंतव्य डुप्लिकेट का वेक्टर बना सकते हैं। आप एक समान लूप का उपयोग कर सकते हैं जो वेक्टर के माध्यम से चलता है और स्रोत पंक्ति को गंतव्य पंक्ति पर प्रतिलिपि बनाता है। सौभाग्य! – SSteve

23

OpenCV 2.4.1 में तरीका है:

A.row(0).copyTo(B.row(0)); 
A.row(2).copyTo(B.row(1)); 
A.row(4).copyTo(B.row(2));