OpenCV(C++) 和 Matlab 中的矩阵掩蔽操作
Matrix masking operation in OpenCV(C++) and in Matlab
我想使用 cv::Mat 个变量进行以下操作(在 Matlab 中处于当前状态)。
我有矩阵掩码:
mask =
1 0 0
1 0 1
然后矩阵M:
M =
1
2
3
4
5
6
3
和样本 = M(mask,:)
samples =
1
2
6
我的问题是,如何使用 OpenCV 执行相同的操作,例如 M(mask,:)?
据我所知,这个东西的壁橱函数是 opencv
中的 copyTo
函数,它获得 matrix
和 mask
作为输入。但此函数保留矩阵的原始结构,您可以对其进行测试。
我认为在 opencv(in c++) 中使用 for
循环没有问题,因为它很快。我建议使用带有以下代码的 for
循环。
Mat M=(Mat_<uchar>(2,3)<<1,2,3,4,5,6); //Create M
cout<<M<<endl;
Mat mask=(Mat_<bool>(2,3)<<1,0,0,1,0,1); // Create mask
cout<<mask<<endl;
Mat samples;
///////////////////////////////
for(int i=0;i<M.total();i++)
{
if(mask.at<uchar>(i))
samples.push_back(M.at<uchar>(i));
}
cout<<samples<<endl;
以上代码结果低于输出。
[ 1, 2, 3;
4, 5, 6]
[ 1, 0, 0;
1, 0, 1]
[ 1;
4;
6]
使用 copyTo 你的输出将如下所示
[1 0 0
4 0 6];
我想使用 cv::Mat 个变量进行以下操作(在 Matlab 中处于当前状态)。
我有矩阵掩码:
mask =
1 0 0
1 0 1
然后矩阵M:
M =
1
2
3
4
5
6
3
和样本 = M(mask,:)
samples =
1
2
6
我的问题是,如何使用 OpenCV 执行相同的操作,例如 M(mask,:)?
据我所知,这个东西的壁橱函数是 opencv
中的 copyTo
函数,它获得 matrix
和 mask
作为输入。但此函数保留矩阵的原始结构,您可以对其进行测试。
我认为在 opencv(in c++) 中使用 for
循环没有问题,因为它很快。我建议使用带有以下代码的 for
循环。
Mat M=(Mat_<uchar>(2,3)<<1,2,3,4,5,6); //Create M
cout<<M<<endl;
Mat mask=(Mat_<bool>(2,3)<<1,0,0,1,0,1); // Create mask
cout<<mask<<endl;
Mat samples;
///////////////////////////////
for(int i=0;i<M.total();i++)
{
if(mask.at<uchar>(i))
samples.push_back(M.at<uchar>(i));
}
cout<<samples<<endl;
以上代码结果低于输出。
[ 1, 2, 3;
4, 5, 6]
[ 1, 0, 0;
1, 0, 1]
[ 1;
4;
6]
使用 copyTo 你的输出将如下所示
[1 0 0
4 0 6];