Blame view

3rdparty/opencv-4.5.4/modules/stitching/test/test_exposure_compensate.cpp 2.24 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  // This file is part of OpenCV project.
  // It is subject to the license terms in the LICENSE file found in the top-level directory
  // of this distribution and at http://opencv.org/license.html.
  
  #include "test_precomp.hpp"
  
  namespace opencv_test {
  namespace {
  
  double minPSNR(UMat src1, UMat src2)
  {
      std::vector<UMat> src1_channels, src2_channels;
      split(src1, src1_channels);
      split(src2, src2_channels);
  
      double psnr = cvtest::PSNR(src1_channels[0], src2_channels[0]);
      psnr = std::min(psnr, cvtest::PSNR(src1_channels[1], src2_channels[1]));
      return std::min(psnr, cvtest::PSNR(src1_channels[2], src2_channels[2]));
  }
  
  TEST(ExposureCompensate, SimilarityThreshold)
  {
      UMat source;
      imread(cvtest::TS::ptr()->get_data_path() + "stitching/s1.jpg").copyTo(source);
  
      UMat image1 = source.clone();
      UMat image2 = source.clone();
  
      // Add a big artifact
      image2(Rect(150, 150, 100, 100)).setTo(Scalar(0, 0, 255));
  
      UMat mask(image1.size(), CV_8U);
      mask.setTo(255);
  
      detail::BlocksChannelsCompensator compensator;
      compensator.setNrGainsFilteringIterations(0); // makes it more clear
  
      // Feed the compensator, image 1 and 2 are perfectly
      // identical, except for the red artifact in image 2
      // Apart from that artifact, there is no exposure to compensate
      compensator.setSimilarityThreshold(1);
      uchar xff = 255;
      compensator.feed(
          {{}, {}},
          {image1, image2},
          {{mask, xff}, {mask, xff}}
      );
      // Verify that the artifact in image 2 did create
      // an artifact in image1 during the exposure compensation
      UMat image1_result = image1.clone();
      compensator.apply(0, {}, image1_result, mask);
      double psnr_no_similarity_mask = minPSNR(image1, image1_result);
      EXPECT_LT(psnr_no_similarity_mask, 45);
  
      // Add a similarity threshold and verify that
      // the artifact in image1 is gone
      compensator.setSimilarityThreshold(0.1);
      compensator.feed(
          {{}, {}},
          {image1, image2},
          {{mask, xff}, {mask, xff}}
      );
      image1_result = image1.clone();
      compensator.apply(0, {}, image1_result, mask);
      double psnr_similarity_mask = minPSNR(image1, image1_result);
      EXPECT_GT(psnr_similarity_mask, 300);
  }
  
  } // namespace
  } // namespace opencv_test