我一直在努力实现一些非常微不足道的东西,并且在 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
,并且都不允许使用标量乘数,并且需要相同“大小和类型”的矩阵。在这种情况下,我可以创建一个矩阵,然后使用scale参数,但这看起来非常无关
任何直接的简单方法都会很棒!
答案 0 :(得分:18)
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
答案 1 :(得分:2)
对于大垫子,您应该使用forEach。
如果C ++ 11可用:
m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);
答案 2 :(得分:1)
Mat m = (Mat_<float>(3, 3)<<
1, 2, 3,
4, 5, 6,
7, 8, 9)*5;
答案 3 :(得分:0)
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);
答案 4 :(得分:0)
对于java,没有运算符重载,但Mat对象使用convertTo方法提供功能。
Mat dst= new Mat(src.rows(),src.cols(),src.type());
src.convertTo(dst,-1,scale,offset);