From 4096b545603a71e7713bad28a1d40e9ae6e352cd Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" Date: Wed, 20 Mar 2013 01:52:40 +0400 Subject: [PATCH] use static assertation where suitable --- modules/calib3d/test/test_fundam.cpp | 97 ++++++++++++----------- modules/core/include/opencv2/core/affine.hpp | 10 +-- modules/core/include/opencv2/core/mat.hpp | 6 +- modules/core/include/opencv2/core/operations.hpp | 24 +++--- modules/features2d/src/fast.cpp | 98 ++++++++++++------------ modules/ts/include/opencv2/ts/ts_perf.hpp | 4 - modules/ts/src/ts_perf.cpp | 6 +- 7 files changed, 121 insertions(+), 124 deletions(-) diff --git a/modules/calib3d/test/test_fundam.cpp b/modules/calib3d/test/test_fundam.cpp index 19ee70f..67a8a98 100644 --- a/modules/calib3d/test/test_fundam.cpp +++ b/modules/calib3d/test/test_fundam.cpp @@ -1079,7 +1079,7 @@ protected: void run_func(); void prepare_to_validation( int ); - double sampson_error(const double* f, double x1, double y1, double x2, double y2); + double sampson_error(const double* f, double x1, double y1, double x2, double y2); int method; int img_size; @@ -1145,9 +1145,8 @@ void CV_EssentialMatTest::get_test_array_types_and_sizes( int /*test_case_idx*/, int pt_count = MAX(5, cvRound(exp(pt_count_exp))); dims = cvtest::randInt(rng) % 2 + 2; - dims = 2; + dims = 2; method = CV_LMEDS << (cvtest::randInt(rng) % 2); - types[INPUT][0] = CV_MAKETYPE(pt_depth, 1); @@ -1192,11 +1191,11 @@ void CV_EssentialMatTest::get_test_array_types_and_sizes( int /*test_case_idx*/, sizes[OUTPUT][0] = sizes[REF_OUTPUT][0] = cvSize(3,1); types[OUTPUT][0] = types[REF_OUTPUT][0] = CV_64FC1; sizes[OUTPUT][1] = sizes[REF_OUTPUT][1] = cvSize(pt_count,1); - types[OUTPUT][1] = types[REF_OUTPUT][1] = CV_8UC1; + types[OUTPUT][1] = types[REF_OUTPUT][1] = CV_8UC1; sizes[OUTPUT][2] = sizes[REF_OUTPUT][2] = cvSize(1,1); types[OUTPUT][2] = types[REF_OUTPUT][2] = CV_64FC1; sizes[OUTPUT][3] = sizes[REF_OUTPUT][3] = cvSize(1,1); - types[OUTPUT][3] = types[REF_OUTPUT][3] = CV_8UC1; + types[OUTPUT][3] = types[REF_OUTPUT][3] = CV_8UC1; } @@ -1289,46 +1288,46 @@ int CV_EssentialMatTest::prepare_test_case( int test_case_idx ) void CV_EssentialMatTest::run_func() { Mat _input0(test_mat[INPUT][0]), _input1(test_mat[INPUT][1]); - Mat K(test_mat[INPUT][4]); - double focal(K.at(0, 0)); - cv::Point2d pp(K.at(0, 2), K.at(1, 2)); + Mat K(test_mat[INPUT][4]); + double focal(K.at(0, 0)); + cv::Point2d pp(K.at(0, 2), K.at(1, 2)); RNG& rng = ts->get_rng(); Mat E, mask1(test_mat[TEMP][1]); - E = cv::findEssentialMat( _input0, _input1, focal, pp, method, 0.99, MAX(sigma*3, 0.0001), mask1 ); - if (E.rows > 3) + E = cv::findEssentialMat( _input0, _input1, focal, pp, method, 0.99, MAX(sigma*3, 0.0001), mask1 ); + if (E.rows > 3) { - int count = E.rows / 3; - int row = (cvtest::randInt(rng) % count) * 3; - E = E.rowRange(row, row + 3) * 1.0; + int count = E.rows / 3; + int row = (cvtest::randInt(rng) % count) * 3; + E = E.rowRange(row, row + 3) * 1.0; } - E.copyTo(test_mat[TEMP][0]); + E.copyTo(test_mat[TEMP][0]); - Mat R, t, mask2; - recoverPose( E, _input0, _input1, R, t, focal, pp, mask2 ); - R.copyTo(test_mat[TEMP][2]); - t.copyTo(test_mat[TEMP][3]); - mask2.copyTo(test_mat[TEMP][4]); + Mat R, t, mask2; + recoverPose( E, _input0, _input1, R, t, focal, pp, mask2 ); + R.copyTo(test_mat[TEMP][2]); + t.copyTo(test_mat[TEMP][3]); + mask2.copyTo(test_mat[TEMP][4]); } double CV_EssentialMatTest::sampson_error(const double * f, double x1, double y1, double x2, double y2) { double Fx1[3] = { - f[0] * x1 + f[1] * y1 + f[2], - f[3] * x1 + f[4] * y1 + f[5], + f[0] * x1 + f[1] * y1 + f[2], + f[3] * x1 + f[4] * y1 + f[5], f[6] * x1 + f[7] * y1 + f[8] - }; + }; double Ftx2[3] = { - f[0] * x2 + f[3] * y2 + f[6], - f[1] * x2 + f[4] * y2 + f[7], + f[0] * x2 + f[3] * y2 + f[6], + f[1] * x2 + f[4] * y2 + f[7], f[2] * x2 + f[5] * y2 + f[8] - }; - double x2tFx1 = Fx1[0] * x2 + Fx1[1] * y2 + Fx1[2]; + }; + double x2tFx1 = Fx1[0] * x2 + Fx1[1] * y2 + Fx1[2]; - double error = x2tFx1 * x2tFx1 / (Fx1[0] * Fx1[0] + Fx1[1] * Fx1[1] + Ftx2[0] * Ftx2[0] + Ftx2[1] * Ftx2[1]); - error = sqrt(error); - return error; + double error = x2tFx1 * x2tFx1 / (Fx1[0] * Fx1[0] + Fx1[1] * Fx1[1] + Ftx2[0] * Ftx2[0] + Ftx2[1] * Ftx2[1]); + error = sqrt(error); + return error; } @@ -1338,7 +1337,7 @@ void CV_EssentialMatTest::prepare_to_validation( int test_case_idx ) const Mat& A = test_mat[INPUT][4]; double f0[9], f[9], e[9]; Mat F0(3, 3, CV_64FC1, f0), F(3, 3, CV_64F, f); - Mat E(3, 3, CV_64F, e); + Mat E(3, 3, CV_64F, e); Mat invA, R=Rt0.colRange(0, 3), T1, T2; @@ -1362,7 +1361,7 @@ void CV_EssentialMatTest::prepare_to_validation( int test_case_idx ) uchar* mtfm2 = test_mat[OUTPUT][1].data; double* e_prop1 = (double*)test_mat[REF_OUTPUT][0].data; double* e_prop2 = (double*)test_mat[OUTPUT][0].data; - Mat E_prop2 = Mat(3, 1, CV_64F, e_prop2); + Mat E_prop2 = Mat(3, 1, CV_64F, e_prop2); int i, pt_count = test_mat[INPUT][2].cols; Mat p1( 1, pt_count, CV_64FC2 ); @@ -1381,8 +1380,8 @@ void CV_EssentialMatTest::prepare_to_validation( int test_case_idx ) double y1 = p1.at(i).y; double x2 = p2.at(i).x; double y2 = p2.at(i).y; -// double t0 = sampson_error(f0, x1, y1, x2, y2); -// double t = sampson_error(f, x1, y1, x2, y2); +// double t0 = sampson_error(f0, x1, y1, x2, y2); +// double t = sampson_error(f, x1, y1, x2, y2); double n1 = 1./sqrt(x1*x1 + y1*y1 + 1); double n2 = 1./sqrt(x2*x2 + y2*y2 + 1); double t0 = fabs(f0[0]*x2*x1 + f0[1]*x2*y1 + f0[2]*x2 + @@ -1394,7 +1393,7 @@ void CV_EssentialMatTest::prepare_to_validation( int test_case_idx ) mtfm1[i] = 1; mtfm2[i] = !status[i] || t0 > err_level || t < err_level; } - + e_prop1[0] = sqrt(0.5); e_prop1[1] = sqrt(0.5); e_prop1[2] = 0; @@ -1402,26 +1401,26 @@ void CV_EssentialMatTest::prepare_to_validation( int test_case_idx ) e_prop2[0] = 0; e_prop2[1] = 0; e_prop2[2] = 0; - SVD::compute(E, E_prop2); + SVD::compute(E, E_prop2); - double* pose_prop1 = (double*)test_mat[REF_OUTPUT][2].data; - double* pose_prop2 = (double*)test_mat[OUTPUT][2].data; - double terr1 = norm(Rt0.col(3) / norm(Rt0.col(3)) + test_mat[TEMP][3]); - double terr2 = norm(Rt0.col(3) / norm(Rt0.col(3)) - test_mat[TEMP][3]); - Mat rvec; - Rodrigues(Rt0.colRange(0, 3), rvec); - pose_prop1[0] = 0; - // No check for CV_LMeDS on translation. Since it - // involves with some degraded problem, when data is exact inliers. - pose_prop2[0] = method == CV_LMEDS || pt_count == 5 ? 0 : MIN(terr1, terr2); + double* pose_prop1 = (double*)test_mat[REF_OUTPUT][2].data; + double* pose_prop2 = (double*)test_mat[OUTPUT][2].data; + double terr1 = norm(Rt0.col(3) / norm(Rt0.col(3)) + test_mat[TEMP][3]); + double terr2 = norm(Rt0.col(3) / norm(Rt0.col(3)) - test_mat[TEMP][3]); + Mat rvec; + Rodrigues(Rt0.colRange(0, 3), rvec); + pose_prop1[0] = 0; + // No check for CV_LMeDS on translation. Since it + // involves with some degraded problem, when data is exact inliers. + pose_prop2[0] = method == CV_LMEDS || pt_count == 5 ? 0 : MIN(terr1, terr2); -// int inliers_count = countNonZero(test_mat[TEMP][1]); -// int good_count = countNonZero(test_mat[TEMP][4]); - test_mat[OUTPUT][3] = true; //good_count >= inliers_count / 2; - test_mat[REF_OUTPUT][3] = true; +// int inliers_count = countNonZero(test_mat[TEMP][1]); +// int good_count = countNonZero(test_mat[TEMP][4]); + test_mat[OUTPUT][3] = true; //good_count >= inliers_count / 2; + test_mat[REF_OUTPUT][3] = true; } diff --git a/modules/core/include/opencv2/core/affine.hpp b/modules/core/include/opencv2/core/affine.hpp index 7e97dc2..ae6a6a9 100644 --- a/modules/core/include/opencv2/core/affine.hpp +++ b/modules/core/include/opencv2/core/affine.hpp @@ -68,7 +68,7 @@ namespace cv //Rodrigues vector Affine3(const Vec3& rvec, const Vec3& t = Vec3::all(0)); - + //Combines all contructors above. Supports 4x4, 3x3, 1x3, 3x1 sizes of data matrix explicit Affine3(const cv::Mat& data, const Vec3& t = Vec3::all(0)); @@ -79,13 +79,13 @@ namespace cv //Rotation matrix void rotation(const Mat3& R); - + //Rodrigues vector void rotation(const Vec3& rvec); - + //Combines rotation methods above. Suports 3x3, 1x3, 3x1 sizes of data matrix; void rotation(const Mat& data); - + //Euler angles void rotation(float_type alpha, float_type beta, float_type gamma); @@ -218,7 +218,7 @@ template inline void cv::Affine3::rotation(const Vec3& rvec) template inline void cv::Affine3::rotation(const cv::Mat& data) { CV_Assert(data.type() == cv::DataType::type); - + if (data.cols == 3 && data.rows == 3) { Mat3 R; diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index 6b0c479..5353b42 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -764,7 +764,7 @@ inline void SVD::solveZ( InputArray m, OutputArray _dst ) template inline void SVD::compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w, Matx<_Tp, m, nm>& u, Matx<_Tp, n, nm>& vt ) { - assert( nm == MIN(m, n)); + CV_StaticAssert( nm == MIN(m, n), "Invalid size of output vector."); Mat _a(a, false), _u(u, false), _w(w, false), _vt(vt, false); SVD::compute(_a, _w, _u, _vt); CV_Assert(_w.data == (uchar*)&w.val[0] && _u.data == (uchar*)&u.val[0] && _vt.data == (uchar*)&vt.val[0]); @@ -773,7 +773,7 @@ template inline void template inline void SVD::compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w ) { - assert( nm == MIN(m, n)); + CV_StaticAssert( nm == MIN(m, n), "Invalid size of output vector."); Mat _a(a, false), _w(w, false); SVD::compute(_a, _w); CV_Assert(_w.data == (uchar*)&w.val[0]); @@ -784,7 +784,7 @@ SVD::backSubst( const Matx<_Tp, nm, 1>& w, const Matx<_Tp, m, nm>& u, const Matx<_Tp, n, nm>& vt, const Matx<_Tp, m, nb>& rhs, Matx<_Tp, n, nb>& dst ) { - assert( nm == MIN(m, n)); + CV_StaticAssert( nm == MIN(m, n), "Invalid size of output vector."); Mat _u(u, false), _w(w, false), _vt(vt, false), _rhs(rhs, false), _dst(dst, false); SVD::backSubst(_w, _u, _vt, _rhs, _dst); CV_Assert(_dst.data == (uchar*)&dst.val[0]); diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 8c73349..e3c45cd 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -82,7 +82,7 @@ # endif # ifndef CV_StaticAssert # if defined(__GNUC__) && (__GNUC__ > 3) && (__GNUC_MINOR__ > 2) -# define CV_StaticAssert(condition, reason) ({ extern int __attribute__((error("CV_StaticAssert: " reason " " #condition))) CV_StaticAssert(); ((condition) ? 0 : CV_StaticAssert()), 0; }) +# define CV_StaticAssert(condition, reason) ({ extern int __attribute__((error("CV_StaticAssert: " reason " " #condition))) CV_StaticAssert(); ((condition) ? 0 : CV_StaticAssert()); }) # else namespace cv { template struct CV_StaticAssert_failed; @@ -201,28 +201,28 @@ template inline Matx<_Tp, m, n>::Matx(_Tp v0) template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1) { - assert(channels >= 2); + CV_StaticAssert(channels >= 2, "Matx should have at least 2 elaments."); val[0] = v0; val[1] = v1; for(int i = 2; i < channels; i++) val[i] = _Tp(0); } template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2) { - assert(channels >= 3); + CV_StaticAssert(channels >= 3, "Matx should have at least 3 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; for(int i = 3; i < channels; i++) val[i] = _Tp(0); } template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3) { - assert(channels >= 4); + CV_StaticAssert(channels >= 4, "Matx should have at least 4 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; for(int i = 4; i < channels; i++) val[i] = _Tp(0); } template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4) { - assert(channels >= 5); + CV_StaticAssert(channels >= 5, "Matx should have at least 5 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; for(int i = 5; i < channels; i++) val[i] = _Tp(0); } @@ -230,7 +230,7 @@ template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1 template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5) { - assert(channels >= 6); + CV_StaticAssert(channels >= 6, "Matx should have at least 6 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; for(int i = 6; i < channels; i++) val[i] = _Tp(0); @@ -239,7 +239,7 @@ template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1 template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6) { - assert(channels >= 7); + CV_StaticAssert(channels >= 7, "Matx should have at least 7 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; val[6] = v6; for(int i = 7; i < channels; i++) val[i] = _Tp(0); @@ -248,7 +248,7 @@ template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1 template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7) { - assert(channels >= 8); + CV_StaticAssert(channels >= 8, "Matx should have at least 8 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; for(int i = 8; i < channels; i++) val[i] = _Tp(0); @@ -258,7 +258,7 @@ template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1 _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8) { - assert(channels >= 9); + CV_StaticAssert(channels >= 9, "Matx should have at least 9 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; val[8] = v8; @@ -269,7 +269,7 @@ template inline Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1 _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9) { - assert(channels >= 10); + CV_StaticAssert(channels >= 10, "Matx should have at least 10 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; val[8] = v8; val[9] = v9; @@ -282,7 +282,7 @@ inline Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11) { - assert(channels == 12); + CV_StaticAssert(channels == 12, "Matx should have at least 12 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; val[8] = v8; val[9] = v9; val[10] = v10; val[11] = v11; @@ -294,7 +294,7 @@ inline Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13, _Tp v14, _Tp v15) { - assert(channels == 16); + CV_StaticAssert(channels == 16, "Matx should have at least 16 elaments."); val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; val[8] = v8; val[9] = v9; val[10] = v10; val[11] = v11; diff --git a/modules/features2d/src/fast.cpp b/modules/features2d/src/fast.cpp index 8306e3e..e026412 100644 --- a/modules/features2d/src/fast.cpp +++ b/modules/features2d/src/fast.cpp @@ -100,61 +100,61 @@ void FAST_t(InputArray _img, std::vector& keypoints, int threshold, bo #if CV_SSE2 if( patternSize == 16 ) { - for(; j < img.cols - 16 - 3; j += 16, ptr += 16) - { - __m128i m0, m1; - __m128i v0 = _mm_loadu_si128((const __m128i*)ptr); - __m128i v1 = _mm_xor_si128(_mm_subs_epu8(v0, t), delta); - v0 = _mm_xor_si128(_mm_adds_epu8(v0, t), delta); - - __m128i x0 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[0])), delta); - __m128i x1 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[quarterPatternSize])), delta); - __m128i x2 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[2*quarterPatternSize])), delta); - __m128i x3 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[3*quarterPatternSize])), delta); - m0 = _mm_and_si128(_mm_cmpgt_epi8(x0, v0), _mm_cmpgt_epi8(x1, v0)); - m1 = _mm_and_si128(_mm_cmpgt_epi8(v1, x0), _mm_cmpgt_epi8(v1, x1)); - m0 = _mm_or_si128(m0, _mm_and_si128(_mm_cmpgt_epi8(x1, v0), _mm_cmpgt_epi8(x2, v0))); - m1 = _mm_or_si128(m1, _mm_and_si128(_mm_cmpgt_epi8(v1, x1), _mm_cmpgt_epi8(v1, x2))); - m0 = _mm_or_si128(m0, _mm_and_si128(_mm_cmpgt_epi8(x2, v0), _mm_cmpgt_epi8(x3, v0))); - m1 = _mm_or_si128(m1, _mm_and_si128(_mm_cmpgt_epi8(v1, x2), _mm_cmpgt_epi8(v1, x3))); - m0 = _mm_or_si128(m0, _mm_and_si128(_mm_cmpgt_epi8(x3, v0), _mm_cmpgt_epi8(x0, v0))); - m1 = _mm_or_si128(m1, _mm_and_si128(_mm_cmpgt_epi8(v1, x3), _mm_cmpgt_epi8(v1, x0))); - m0 = _mm_or_si128(m0, m1); - int mask = _mm_movemask_epi8(m0); - if( mask == 0 ) - continue; - if( (mask & 255) == 0 ) + for(; j < img.cols - 16 - 3; j += 16, ptr += 16) { - j -= 8; - ptr -= 8; - continue; - } + __m128i m0, m1; + __m128i v0 = _mm_loadu_si128((const __m128i*)ptr); + __m128i v1 = _mm_xor_si128(_mm_subs_epu8(v0, t), delta); + v0 = _mm_xor_si128(_mm_adds_epu8(v0, t), delta); + + __m128i x0 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[0])), delta); + __m128i x1 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[quarterPatternSize])), delta); + __m128i x2 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[2*quarterPatternSize])), delta); + __m128i x3 = _mm_sub_epi8(_mm_loadu_si128((const __m128i*)(ptr + pixel[3*quarterPatternSize])), delta); + m0 = _mm_and_si128(_mm_cmpgt_epi8(x0, v0), _mm_cmpgt_epi8(x1, v0)); + m1 = _mm_and_si128(_mm_cmpgt_epi8(v1, x0), _mm_cmpgt_epi8(v1, x1)); + m0 = _mm_or_si128(m0, _mm_and_si128(_mm_cmpgt_epi8(x1, v0), _mm_cmpgt_epi8(x2, v0))); + m1 = _mm_or_si128(m1, _mm_and_si128(_mm_cmpgt_epi8(v1, x1), _mm_cmpgt_epi8(v1, x2))); + m0 = _mm_or_si128(m0, _mm_and_si128(_mm_cmpgt_epi8(x2, v0), _mm_cmpgt_epi8(x3, v0))); + m1 = _mm_or_si128(m1, _mm_and_si128(_mm_cmpgt_epi8(v1, x2), _mm_cmpgt_epi8(v1, x3))); + m0 = _mm_or_si128(m0, _mm_and_si128(_mm_cmpgt_epi8(x3, v0), _mm_cmpgt_epi8(x0, v0))); + m1 = _mm_or_si128(m1, _mm_and_si128(_mm_cmpgt_epi8(v1, x3), _mm_cmpgt_epi8(v1, x0))); + m0 = _mm_or_si128(m0, m1); + int mask = _mm_movemask_epi8(m0); + if( mask == 0 ) + continue; + if( (mask & 255) == 0 ) + { + j -= 8; + ptr -= 8; + continue; + } - __m128i c0 = _mm_setzero_si128(), c1 = c0, max0 = c0, max1 = c0; - for( k = 0; k < N; k++ ) - { - __m128i x = _mm_xor_si128(_mm_loadu_si128((const __m128i*)(ptr + pixel[k])), delta); - m0 = _mm_cmpgt_epi8(x, v0); - m1 = _mm_cmpgt_epi8(v1, x); + __m128i c0 = _mm_setzero_si128(), c1 = c0, max0 = c0, max1 = c0; + for( k = 0; k < N; k++ ) + { + __m128i x = _mm_xor_si128(_mm_loadu_si128((const __m128i*)(ptr + pixel[k])), delta); + m0 = _mm_cmpgt_epi8(x, v0); + m1 = _mm_cmpgt_epi8(v1, x); - c0 = _mm_and_si128(_mm_sub_epi8(c0, m0), m0); - c1 = _mm_and_si128(_mm_sub_epi8(c1, m1), m1); + c0 = _mm_and_si128(_mm_sub_epi8(c0, m0), m0); + c1 = _mm_and_si128(_mm_sub_epi8(c1, m1), m1); - max0 = _mm_max_epu8(max0, c0); - max1 = _mm_max_epu8(max1, c1); - } + max0 = _mm_max_epu8(max0, c0); + max1 = _mm_max_epu8(max1, c1); + } - max0 = _mm_max_epu8(max0, max1); - int m = _mm_movemask_epi8(_mm_cmpgt_epi8(max0, K16)); + max0 = _mm_max_epu8(max0, max1); + int m = _mm_movemask_epi8(_mm_cmpgt_epi8(max0, K16)); - for( k = 0; m > 0 && k < 16; k++, m >>= 1 ) - if(m & 1) - { - cornerpos[ncorners++] = j+k; - if(nonmax_suppression) - curr[j+k] = (uchar)cornerScore(ptr+k, pixel, threshold); - } - } + for( k = 0; m > 0 && k < 16; k++, m >>= 1 ) + if(m & 1) + { + cornerpos[ncorners++] = j+k; + if(nonmax_suppression) + curr[j+k] = (uchar)cornerScore(ptr+k, pixel, threshold); + } + } } #endif for( ; j < img.cols - 3; j++, ptr++ ) diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index cd8209f..de48a80 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -208,7 +208,6 @@ private: #define SANITY_CHECK_KEYPOINTS(array, ...) ::perf::Regression::addKeypoints(this, #array, array , ## __VA_ARGS__) #define SANITY_CHECK_MATCHES(array, ...) ::perf::Regression::addMatches(this, #array, array , ## __VA_ARGS__) -#ifdef HAVE_CUDA class CV_EXPORTS GpuPerf { public: @@ -216,9 +215,6 @@ public: }; # define PERF_RUN_GPU() ::perf::GpuPerf::targetDevice() -#else -# define PERF_RUN_GPU() false -#endif /*****************************************************************************************\ diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index f84953c..14e8911 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -1324,12 +1324,14 @@ void perf::sort(std::vector& pts, cv::InputOutputArray descriptors /*****************************************************************************************\ * ::perf::GpuPerf \*****************************************************************************************/ -#ifdef HAVE_CUDA bool perf::GpuPerf::targetDevice() { +#ifdef HAVE_CUDA return !param_run_cpu; -} +#else + return false; #endif +} /*****************************************************************************************\ * ::perf::PrintTo -- 2.7.4