将选择行复制到新矩阵中

时间:2011-08-09 09:41:17

标签: opencv matrix eigen

我想按顺序将矩阵A的第0行,第2行和第4行复制到B中。 设A = [a0,a1,a2,a3,a4] ^ T,其中a_i为行向量, 那么B应该是:[a0,a2,a4] ^ T。

下面的代码完成了我想要的但我想知道是否有更漂亮的解决方案(也许使用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;
}

4 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:18)

我找到了push_back

使用B创建size 0 x vec_length,然后使用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;
}

答案 2 :(得分: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);
}

答案 3 :(得分:0)

Mat row = old.row(0);
old.row(0).copyTo(row);
new.push_back(row);