我有一个矩阵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)
答案 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);
答案 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 ]