У меня есть матрица img
(480*640 пикселей, 64 бита с плавающей запятой), к которой я применяю сложную маску. После этого мне нужно умножить мою матрицу на значение, но чтобы выиграть время, я хочу сделать это умножение только для ненулевых элементов, потому что пока умножение слишком длинное, потому что мне нужно повторить операцию 2000 раз на 2000 другая матрица, но с той же маской. Итак, я нашел индекс (по осям x/y) ненулевых пикселей, которые я храню в векторе Point. Но мне не удается использовать этот вектор для умножения только на пиксели, проиндексированные в этом же векторе.
Вот пример (с простой маской), чтобы понять мою проблему:
Mat img_temp(480, 640, CV_64FC1);
Mat img = img_temp.clone();
Mat mask = Mat::ones(img.size(), CV_8UC1);
double value = 3.56;
// Apply mask
img_temp.copyTo(img, mask);
// Finding non zero elements
vector<Point> nonZero;
findNonZero(img, nonZero);
// Previous multiplication (long because on all pixels)
Mat result = img.clone()*value;
// What I wish to do : multiplication only on non-zero pixels (not functional)
Mat result = Mat::zeros(img.size(), CV_64FC1);
result.at<int>(nonZero) = img.at(nonZero).clone() * value
Что сложно, так это то, что мои пиксели не находятся в диапазоне (например, пиксели 3, 4 и 50, 51 в строке).
Заранее спасибо.
Mat.convertTo
, если вам нужно умножить постоянное значение на ненулевые элементы, что будет самым быстрым. Я не понимаю, почему вам нужно найти все пиксели с ненулевыми значениями, поскольку вы в конечном итоге умножаете (умножаете на 0?) - person Rick M.   schedule 23.05.2018convertTo
это преобразование значения в матрицу для умножения, я думаю. - person Mathieu Gauquelin   schedule 23.05.2018convertTo
, но я изучу это, спасибо. Я не понял ваш первый ответ извините :( - person Mathieu Gauquelin   schedule 23.05.2018