From fba70ca13138af5521e23f4979f389c15cb9a035 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 15 Aug 2011 13:24:13 +0000 Subject: [PATCH] fixed bug #1306 (Vec assignment); added tests for Vec & Matx multiplication --- modules/core/include/opencv2/core/core.hpp | 1 - .../core/include/opencv2/core/operations.hpp | 10 +--- modules/core/test/test_operations.cpp | 58 +++++++++++++++++++ 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 9e1d8556dd..cfe096b930 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -592,7 +592,6 @@ public: explicit Vec(const _Tp* values); Vec(const Vec<_Tp, cn>& v); - Vec<_Tp, cn>& operator =(const Matx<_Tp, cn, 1>& m); static Vec all(_Tp alpha); diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index c6b5e9c630..8859de1dfe 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -1038,15 +1038,7 @@ template template inline Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp op) : Matx<_Tp, cn, 1>(a, alpha, op) {} - -template inline -Vec<_Tp, cn>& Vec<_Tp, cn>::operator = (const Matx<_Tp, cn, 1>& m) -{ - for( int i = 0; i < cn; i++ ) - this->val[i] = m.val[i]; - return *this; -} - + template inline Vec<_Tp, cn> Vec<_Tp, cn>::all(_Tp alpha) { Vec v; diff --git a/modules/core/test/test_operations.cpp b/modules/core/test/test_operations.cpp index 1abaf14956..41cc4499e4 100644 --- a/modules/core/test/test_operations.cpp +++ b/modules/core/test/test_operations.cpp @@ -72,6 +72,8 @@ protected: bool TestTemplateMat(); bool TestMatND(); bool TestSparseMat(); + bool TestVec(); + bool TestMatxMultiplication(); bool operations1(); void checkDiff(const Mat& m1, const Mat& m2, const string& s) { if (norm(m1, m2, NORM_INF) != 0) throw test_excep(s); } @@ -747,6 +749,56 @@ bool CV_OperationsTest::TestSparseMat() return true; } + +bool CV_OperationsTest::TestMatxMultiplication() +{ + try + { + Matx33f mat(1, 0, 0, 0, 1, 0, 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(); + } + catch(const test_excep&) + { + ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT); + return false; + } + return true; +} + + +bool CV_OperationsTest::TestVec() +{ + try + { + cv::Mat hsvImage_f(5, 5, CV_32FC3), hsvImage_b(5, 5, CV_8UC3); + int i = 0,j = 0; + cv::Vec3f a; + + //these compile + cv::Vec3b b = a; + hsvImage_f.at(i,j) = cv::Vec3f(i,0,1); + hsvImage_b.at(i,j) = cv::Vec3b(cv::Vec3f(i,0,1)); + + //these don't + b = cv::Vec3f(1,0,0); + cv::Vec3b c; + c = cv::Vec3f(0,0,1); + hsvImage_b.at(i,j) = cv::Vec3f(i,0,1); + hsvImage_b.at(i,j) = a; + hsvImage_b.at(i,j) = cv::Vec3f(1,2,3); + } + catch(const test_excep&) + { + ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT); + return false; + } + return true; +} + bool CV_OperationsTest::operations1() { try @@ -819,6 +871,12 @@ void CV_OperationsTest::run( int /* start_from */) if (!TestSparseMat()) return; + + if (!TestVec()) + return; + + if (!TestMatxMultiplication()) + return; if (!operations1()) return; -- GitLab