Я хотел бы сделать следующую операцию (которая находится в текущем состоянии в Matlab), используя переменные cv :: Mat.
У меня есть матричная маска:
mask =
1 0 0
1 0 1
тогда матрица М:
M =
1
2
3
4
5
6
3
и образцы = M (маска, 🙂
samples =
1
2
6
У меня вопрос, как я могу выполнить такую же операцию, как, M (маска, :), с OpenCV?
С моим знанием функция шкафа к этой вещи copyTo
функция в opencv
что получить matrix
а также mask
для входов. но эта функция содержит оригинальную структуру вашей матрицы, которую вы можете проверить.
Я думаю, что нет проблем в использовании for
цикл в opencv (в c ++), потому что это быстро. Я предлагаю использовать 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];
Других решений пока нет …