如何在垫子中选择一些特定的列?

How to select some specific columns in a Mat?

本文关键字:选择      更新时间:2023-10-16

Matlab中,如果我想选择一个Mat的某个指定的col,同时将它们复制到另一个Mat,我写这样的代码:

mm = nn(:,[1 3]);

如何在OpenCV中做到这一点?

在一般情况下,没有OpenCV函数可以做到这一点。


如果所选列是连续的,则可以使用接受两个RangeMat构造函数:

Mat mm = nn(Range::all(), Range(1, 4)).clone(); // range end is exclusive

mm将包含nn的第 1,2,3 列。


在一般情况下,应将每一列复制到正确的位置。实际上没有办法"同时">执行此操作,但是在函数之外selectColumns您可以获得"同时">行为。

#include <opencv2opencv.hpp>
#include <algorithm>
using namespace std;
using namespace cv;
void selectColumns(const Mat& src, Mat& dst, const vector<int>& columns)
{
    assert(!columns.empty());
    // Be sure that the column indices are valid.
    // They may not be sorted.
    auto limits = minmax_element(columns.begin(), columns.end());
    assert(*limits.first >= 0);
    assert(*limits.second < src.cols);
    int cols = int(columns.size());
    dst.create(src.rows, cols, src.type());
    for (int i = 0; i < cols; ++i)  {
        src.col(columns[i]).copyTo(dst.col(i));
    }
}
int main()
{
    Mat3f nn(3, 5);
    randu(nn, Scalar(0), Scalar(255,255,255));
    Mat mm;
    selectColumns(nn, mm, { 0,2 });
    return 0;
}

请记住,在 C++ 中,索引是从 0 开始的,而在 Matlab 中,索引是从 1 开始的。