added "Matx*Vec -> Vec" operator (ticket #1830)
authorVadim Pisarevsky <no@email>
Tue, 24 Apr 2012 12:45:19 +0000 (12:45 +0000)
committerVadim Pisarevsky <no@email>
Tue, 24 Apr 2012 12:45:19 +0000 (12:45 +0000)
modules/core/include/opencv2/core/operations.hpp
modules/core/test/test_operations.cpp

index 83947b2..ba45886 100644 (file)
@@ -638,6 +638,14 @@ Matx<_Tp, m, n> operator * (const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b)
 }
 
     
+template<typename _Tp, int m, int n> static inline
+Vec<_Tp, m> operator * (const Matx<_Tp, m, n>& a, const Vec<_Tp, n>& b)
+{
+    Matx<_Tp, m, 1> c(a, b, Matx_MatMulOp());
+    return reinterpret_cast<const Vec<_Tp, m>&>(c);
+}
+    
+    
 template<typename _Tp> static inline
 Point_<_Tp> operator * (const Matx<_Tp, 2, 2>& a, const Point_<_Tp>& b)
 {
index 3917e5f..1b645b5 100644 (file)
@@ -754,12 +754,19 @@ bool CV_OperationsTest::TestMatxMultiplication()
 { 
     try 
     { 
-        Matx33f mat(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity matrix 
+        Matx33f mat(1, 1, 1, 0, 1, 1, 0, 0, 1); // Identity matrix 
         Point2f pt(3, 4); 
         Point3f res = mat * pt; // Correctly assumes homogeneous coordinates 
-        if(res.x != 3.0) throw test_excep(); 
-        if(res.y != 4.0) throw test_excep(); 
-        if(res.z != 1.0) throw test_excep(); 
+        
+        Vec3f res2 = mat*Vec3f(res.x, res.y, res.z);
+        
+        if(res.x != 8.0) throw test_excep(); 
+        if(res.y != 5.0) throw test_excep(); 
+        if(res.z != 1.0) throw test_excep();
+        
+        if(res2[0] != 14.0) throw test_excep(); 
+        if(res2[1] != 6.0) throw test_excep(); 
+        if(res2[2] != 1.0) throw test_excep();
     } 
     catch(const test_excep&) 
     {