2013-07-27 175 views
9

我一直在试图实现一些应该很平凡,并且在Matlab中微不足道。Opencv乘标量和矩阵

我想简单实现的东西,如:

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

之后,样本应该仅仅是:

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

我已经试过scaleAddMulMultiply既不允许标量倍增,并要求一个相同“大小和类型”的矩阵。在这种情况下,我可以创建一个矩阵,然后使用比例参数,但看起来很无关

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

+1

不应该'24'是'25'代替??? :P – herohuyongtao

回答

14

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 
+2

此功能仅适用于单通道图像。因此这通常不起作用。您将不得不首先拆分所有通道,然后重新组合,例如\t //(3)拆分RGB图像 \t vector imgPlanes(3); \t split(matImage,imgPlanes); \t Mat matImageK = imgPlanes [0]; – TimZaman

1

这样的事情。

Mat m = (Mat_<float>(3, 3)<< 
        1, 2, 3, 
        4, 5, 6, 
        7, 8, 9)*5; 
0
Mat A = //data;//source Matrix 
Mat B;//destination Matrix 
Scalar alpha = new Scalar(5)//factor 
Core.multiply(A,alpha,b); 
0

对于Java没有操作符重载,但垫对象提供用的ConvertTo方法的功能。

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

Doc on this method is here