15

我一直在尝试实现一些在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, MulMultiply并且都不允许使用标量乘数并且需要相同“大小和类型”的矩阵。在这种情况下,我可以创建一个 Matrix of Ones,然后使用 scale 参数,但这似乎非常无关紧要

任何直接简单的方法都会很棒!

4

5 回答 5

22

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
于 2013-07-27T04:04:33.293 回答
3

对于大垫子,您应该使用forEach

如果 C++11 可用:

m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);
于 2018-09-24T08:31:24.967 回答
1

像这样的东西。

Mat m = (Mat_<float>(3, 3)<<
                    1, 2, 3,
                    4, 5, 6,
                    7, 8, 9)*5;
于 2013-07-27T08:45:55.350 回答
1
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);
于 2017-06-03T23:52:35.403 回答
1

对于 java,没有运算符重载,但 Mat 对象通过 convertTo 方法提供功能。

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

这种方法的文档在这里

于 2017-12-16T21:05:33.850 回答