2012-10-29 165 views
0

我对OpenCV相当陌生,并且对它有点理解。我知道cv::Mat类中的矩阵运算符已经被重载,以执行A.mult(B),A + B,AB,A/B等。在OpenCV中从cv :: Mat对象中减去一个固定值

我有两个矢量,它们是行和列的投影图片。我有两个图像(S和T),因此每个图像都有两个投影向量(rowProjjctionS,columnProjectionS,rowProjectionT,columnProjectionT)。我也有图像的手段(meanS,meanT)。我需要做相关的计算“产品之和”,这在MATLAB是如下

numeratorLambdaRo = sum((rowProjectionT - meanT).*(rowProjectionS - meanS)); 
denominatorLambdaRo = sqrt(sum((rowProjectionT - meanT).^2)*sum((rowProjectionS - meanS).^2); 

LambaRo = numeratorLambdaRo/denominatorLambdaRo; 

我不完全肯定矩阵操作中cv::Mat对象的上下文的能力。

回答

1

声明meanT,meanS为double或cv :: Scalar,你可以从你的矩阵中减去它。你也许可以拆分您的操作:

rowProjectionT -= meanT; 
rowProjectionS -= meanS; 
numeratoLambdaRo = cv::sum(rowProjectionT*rowProjectionS.t()); // transpose 1 of the vector so that multiplication is equivalent to dot product. 

cv::Mat rowProjTSquare = rowProjectionT*rowProjectionT.t(); 
cv::Mat rowProjSSquare = rowProjectionS*rowProjectionS.t(); 
denominatorLambdaRo = sqrt(cv::sum(rowProjTSquare*rowProjSSquare)); 
+0

@ Remi..Thanks的解决方案!我试图用我的MMU(通过使用cv :: isContinuous()函数)玩另一个游戏....如果我很幸运,那么内存分配应该是连续的,因此可以通过Mat ::数据指针提取数据。希望这是另一种解决方案。但因为你的解决方案不涉及指针,我个人讨厌指针(因为我是一个java开发人员的技能:P)嗨你好... – ha9u63ar

+0

@Remi ...你的矩阵乘以*符号不会工作!它是否需要一些头文件来建议操作符重载? – ha9u63ar

+0

检查矩阵尺寸。它可能是rowProjTSquare = rowProjT.t()* rowProjectionT。在一种情况下,你最终得到一个标量(1×1矩阵),在另一种情况下,一个(dxd)矩阵,其中d是你的向量的维数。 – remi