perf_ecc.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "perf_precomp.hpp"
  2. namespace opencv_test {
  3. using namespace perf;
  4. CV_ENUM(MotionType, MOTION_TRANSLATION, MOTION_EUCLIDEAN, MOTION_AFFINE, MOTION_HOMOGRAPHY)
  5. CV_ENUM(ReadFlag, IMREAD_GRAYSCALE, IMREAD_COLOR)
  6. typedef std::tuple<MotionType, ReadFlag> TestParams;
  7. typedef perf::TestBaseWithParam<TestParams> ECCPerfTest;
  8. PERF_TEST_P(ECCPerfTest, findTransformECC,
  9. testing::Combine(testing::Values(MOTION_TRANSLATION, MOTION_EUCLIDEAN, MOTION_AFFINE, MOTION_HOMOGRAPHY),
  10. testing::Values(IMREAD_GRAYSCALE, IMREAD_COLOR))) {
  11. int transform_type = get<0>(GetParam());
  12. int readFlag = get<1>(GetParam());
  13. Mat img = imread(getDataPath("cv/shared/fruits_ecc.png"), readFlag);
  14. Mat templateImage;
  15. Mat warpMat;
  16. Mat warpGround;
  17. double angle;
  18. switch (transform_type) {
  19. case MOTION_TRANSLATION:
  20. warpGround = (Mat_<float>(2, 3) << 1.f, 0.f, 7.234f, 0.f, 1.f, 11.839f);
  21. warpAffine(img, templateImage, warpGround, Size(200, 200), INTER_LINEAR + WARP_INVERSE_MAP);
  22. break;
  23. case MOTION_EUCLIDEAN:
  24. angle = CV_PI / 30;
  25. warpGround = (Mat_<float>(2, 3) << (float)cos(angle), (float)-sin(angle), 12.123f, (float)sin(angle),
  26. (float)cos(angle), 14.789f);
  27. warpAffine(img, templateImage, warpGround, Size(200, 200), INTER_LINEAR + WARP_INVERSE_MAP);
  28. break;
  29. case MOTION_AFFINE:
  30. warpGround = (Mat_<float>(2, 3) << 0.98f, 0.03f, 15.523f, -0.02f, 0.95f, 10.456f);
  31. warpAffine(img, templateImage, warpGround, Size(200, 200), INTER_LINEAR + WARP_INVERSE_MAP);
  32. break;
  33. case MOTION_HOMOGRAPHY:
  34. warpGround = (Mat_<float>(3, 3) << 0.98f, 0.03f, 15.523f, -0.02f, 0.95f, 10.456f, 0.0002f, 0.0003f, 1.f);
  35. warpPerspective(img, templateImage, warpGround, Size(200, 200), INTER_LINEAR + WARP_INVERSE_MAP);
  36. break;
  37. }
  38. TEST_CYCLE() {
  39. if (transform_type < 3)
  40. warpMat = Mat::eye(2, 3, CV_32F);
  41. else
  42. warpMat = Mat::eye(3, 3, CV_32F);
  43. findTransformECC(templateImage, img, warpMat, transform_type,
  44. TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 5, -1));
  45. }
  46. if (transform_type == MOTION_HOMOGRAPHY)
  47. {
  48. // NOTE: for Mac M1 + KleidiCV
  49. // ECCPerfTest_findTransformECC.findTransformECC/6, where GetParam() = (MOTION_HOMOGRAPHY, IMREAD_GRAYSCALE)
  50. SANITY_CHECK(warpMat, 8.3e-3);
  51. }
  52. else
  53. {
  54. SANITY_CHECK(warpMat, 3e-3);
  55. }
  56. }
  57. } // namespace opencv_test