从 OpenCV 中的矩阵访问值

Posted

技术标签:

【中文标题】从 OpenCV 中的矩阵访问值【英文标题】:Access values from Matrix in OpenCV 【发布时间】:2013-02-12 14:42:24 【问题描述】:

例如,我有一个大小为 10x10 的矩阵 M,我有一个长度为 5 的列矩阵 ind 如何使用 OpenCV 将 A(ind,:) 分配给 C++ 中的新矩阵 B?

下面是我在 Matlab 中的操作:

A = [ 41     8    33    36    22    14    38    43    18     4
    46    49     2     2    20    34    13    13    42     3
     7    48    43    14    39    33    26    41    30    27
    46    25    47     3    40     9    35    13    28    39
    32    41    34     5    10     6    45    47    46    47
     5     8    38    42    25    25    48    18    15     7
    14    22    38    35    23    48    28    10    38    29
    28    46    20    16    33    18     7    13    38    24
    48    40    33    48    36    30     8    31    20     1
    49    48     9     2    38    12    13    24    29    17]

ind = [2; 8; 4; 6; 2]  

B = A(ind, :);

B = [ 46    49     2     2    20    34    13    13    42     3
    28    46    20    16    33    18     7    13    38    24
    46    25    47     3    40     9    35    13    28    39
     5     8    38    42    25    25    48    18    15     7
    46    49     2     2    20    34    13    13    42     3]

谁能告诉我如何在 C++ 中使用 OpenCV 而不使用 for 循环来做到这一点

【问题讨论】:

【参考方案1】:

如果不以某种方式进行迭代,就没有直接的方法来提取行/列的随机排序。最简单的方法是提取行并将它们一一推送到目标矩阵中。假设您声明了矩阵 A 及其数据集:

cv::Mat B;
B.push_back(A(cv::Range(2,3),cv::Range::all()));
B.push_back(A(cv::Range(8,9),cv::Range::all()));
B.push_back(A(cv::Range(4,5),cv::Range::all()));
B.push_back(A(cv::Range(6,7),cv::Range::all()));
B.push_back(A(cv::Range(2,3),cv::Range::all()));

应该做你想做的。这使用重载的operator()(cv::rowRange, cv::colRange) 来提取选定的行。

【讨论】:

【参考方案2】:

如果不使用for 循环,我认为这是不可能的,但最快的方法是使用memcpy。可以看完整代码here

【讨论】:

以上是关于从 OpenCV 中的矩阵访问值的主要内容,如果未能解决你的问题,请参考以下文章

opencv怎么给mat赋值

OpenCV 对矩阵进行掩码操作

Mat的单通道作为矩阵Opencv

如何通过另一个具有位置(索引)的垫子访问opencv中的矩阵数据

openCV:从矩阵绘制颜色图

矩阵的简单传递,即。 cv::Mat 到 OpenCV2.4 中的函数