从openCV中较大的Mat中提取指定索引的矩阵?

时间:2014-03-05 18:31:11

标签: opencv image-processing

我有一个矩阵A

A =

 1     2     3     4     5
 6     7     8     9    10
11    12    13    14    15
16    17    18    19    20

我有另一个矩阵来指定索引

index =

 1     2
 3     4

现在我要创建一个矩阵Mat C,其中的像素值与Mat index指定的值相对应

任务:我需要使用 openCV 获取Mat C,如下所示:

C =

 1     6
11    16

PS:类似于MatLab函数C = A(index)

2 个答案:

答案 0 :(得分:2)

在OpenCV中,提取子矩阵而不是几个特定索引更容易。例如,如果您想获得一个子矩阵,在您的示例中,请说

 7     8     9  
12    13    14  

您只需使用

即可
Rect roi(1, 1, 3, 2);    // x, y, width, height
Mat sub_mat = mat(roi);

要获取来自多个特定索引的值,您可能需要循环索引以实现目标。在OpenCV中,您可以使用Mat::at()函数访问矩阵的元素。

float value = mat.at<float>(2, 3);  // value at 3th row, 4th col, i.e. '14'

更好的方法是你可以定义一个掩码矩阵来指定你想要的值,然后你可以调用Mat::copyTo

inputMat.copyTo(outputMat, maskMat);

enter image description here

答案 1 :(得分:1)

您可以通过按如下方式组合Mat::col()Mat::clone()Mat::reshape()来实现此目的,

您的输入Mat

Mat A=(Mat_<uchar>(4,5)<<  1,  2,  3,  4,  5,\
                           6,  7,  8,  9, 10,\
                          11, 12, 13, 14, 15,\
                          16, 17, 18, 19, 20);

<强> 1。 Mat::col() + Mat::clone()

使用索引为任何列创建新标头

Mat B = A.col(0).clone(); //Will give you 0-th column

结果将是一个包含四行和一列的列Mat,如

     [ 1  ]
     | 6  |
  B= | 11 |
     [ 16 ]

<强> 2。Mat::reshape()

现在使用以下代码重塑您的Mat,请注意您的源Mat行应该可以被2整除,以便您将得到方形Mat作为结果

B=B.reshape(0,B.rows/2);

会给你结果..

B = [ 1   6  ]
    [ 11  16 ]