Opencv乘法:标量与矩阵的相乘

18

我一直在尝试实现一些看起来相当简单的功能,而且在 Matlab 中也很简单。

使用 OpenCV 的方法,我想要简单地实现类似于以下的功能:

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

接下来应该只有这个样本:

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

我尝试了scaleAddMulMultiply,但它们都不能进行标量乘法,也需要一个相同“大小和类型”的矩阵。在这种情况下,我可以创建一个全为1的矩阵,然后使用比例参数,但那看起来很多余。

有没有更加直接简单的方法呢?


3
“24”不应该改成“25”吗? :P - herohuyongtao
代码使用的是哪种编程语言? - ed22
5个回答

23

事实上,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

7
这个函数只能用于单通道图像,因此它并不适用于所有情况。你需要先拆分所有通道,然后重新组合它们,例如 //(3) 拆分RGB图像 vector <Mat> imgPlanes(3); split(matImage,imgPlanes); Mat matImageK = imgPlanes [0]; - TimZaman
没有 / 运算符吗? - simplename

5

在Java中没有运算符重载,但是Mat对象提供了convertTo方法来实现类似的功能。

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

这个方法的文档在这里


3

对于大型的矩阵,您应该使用forEach函数。

如果您的编译器支持C++11:

m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);

4
为什么这种方法比使用内置的矩阵标量乘法或cv::multiply更好? - Jack White

1
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);

1
类似这样的内容。
Mat m = (Mat_<float>(3, 3)<<
                    1, 2, 3,
                    4, 5, 6,
                    7, 8, 9)*5;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接