it-roy-ru.com

OpenCV умножить скаляр и матрицу

Я пытался достичь чего-то, что должно быть довольно тривиальным и тривиальным в Matlab .

Я хочу просто достичь чего-то такого как:

cv::Mat sample = [4 5 6; 4 2 5; 1 4 2];
sample = 5*sample;

После чего образец должен быть просто:

[20 24 30; 20 10 25; 5 20 10]

Я пробовал scaleAdd, Mul, Multiply, и ни один из них не разрешает скалярный множитель и требует матрицу с тем же «размером и типом». В этом сценарии я мог бы создать Матрицу Единиц и затем использовать параметр масштаба, но это кажется очень посторонним

Любой прямой простой метод был бы великолепен!

12
Arpan Shah

OpenCV фактически поддерживает умножение на скалярное значение с перегруженным operator*. Возможно, вам потребуется правильно инициализировать матрицу.

float data[] = {1 ,2, 3,
                4, 5, 6,
                7, 8, 9};
cv::Mat m(3, 3, CV_32FC1, data);
m = 3*m;  // This works just fine

Если вас в основном интересуют математические операции, с cv::Matx работать немного проще:

cv::Matx33f mx(1,2,3,
               4,5,6,
               7,8,9);
mx *= 4;  // This works too
18
Aurelius

что-то вроде этого. 

Mat m = (Mat_<float>(3, 3)<<
                    1, 2, 3,
                    4, 5, 6,
                    7, 8, 9)*5;
1
SPV

Для больших матов вы должны использовать forEach .

Если доступен C++ 11:

m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);
1
Black Arrow
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);
0
Syed Safdar Ali

Для Java нет перегрузки операторов, но объект Mat предоставляет функциональность с помощью метода convertTo.

Mat dst= new Mat(src.rows(),src.cols(),src.type());
src.convertTo(dst,-1,scale,offset);

Документ об этом методе здесь

0
J.E.Tkaczyk