1. 15 6月, 2023 1 次提交
  2. 14 6月, 2023 2 次提交
  3. 13 6月, 2023 4 次提交
  4. 11 6月, 2023 2 次提交
  5. 09 6月, 2023 4 次提交
    • A
      61488885
    • V
      Merge pull request #23596 from vrabaud:libavif · 472aad46
      Vincent Rabaud 提交于
      Add AVIF support through libavif. #23596
      
      This is to fix https://github.com/opencv/opencv/issues/19271
      Extra: https://github.com/opencv/opencv_extra/pull/1069
      
      ### Pull Request Readiness Checklist
      
      See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
      
      - [x] I agree to contribute to the project under Apache 2 License.
      - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
      - [x] The PR is proposed to the proper branch
      - [x] There is a reference to the original bug report and related work
      - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
            Patch to opencv_extra has the same branch name.
      - [x] The feature is well documented and sample code can be built with the project CMake
      472aad46
    • P
      Merge pull request #22947 from chacha21:hasNonZero · 60b806f9
      Pierre Chatelier 提交于
      Added cv::hasNonZero() #22947 
      
      `cv::hasNonZero()` is semantically equivalent to (`cv::countNonZero()>0`) but stops parsing the image when a non-zero value is found, for a performance gain
      
      - [X] I agree to contribute to the project under Apache 2 License.
      - [X] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
      - [X] The PR is proposed to the proper branch
      - [ ] There is a reference to the original bug report and related work
      - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
            Patch to opencv_extra has the same branch name.
      - [ ] The feature is well documented and sample code can be built with the project CMake
      
      This pull request might be refused, but I submit it to know if further work is needed or if I just stop working on it.
      The idea is only a performance gain vs `countNonZero()>0` at the cost of more code.
      
      Reasons why it might be refused :
      
      - this is just more code
      - the execution time is "unfair"/"unpredictable" since it depends on the position of the first non-zero value
      - the user must be aware that default search is from first row/col to last row/col and has no way to customize that, even if his use case lets him know where a non zero could be found
      - the PR in its current state is using, for the ocl implementation, a mere `countNonZero()>0` ; there is not much sense in trying to break early the ocl kernel call when non-zero is encountered. So the ocl implementation does not bring any improvement.
      - there is no IPP function that can help (`countNonZero()` is based in `ippCountInRange`)
      - the PR in its current state might be slower than a call to `countNonZero()>0` in some cases (see "challenges" below)
      
      Reasons why it might be accepted :
      
      - the performance gain is huge on average, if we consider that "on average" means "non zero in the middle of the image"
      - the "missing" IPP implementation is replaced by an "Open-CV universal intrinsics" implementation
      - the PR in its current state is almost always faster than a call to `countNonZero()>0`, is only slightly slower in the worst cases, and not even for all matrices
      
      **Challenges**
      The worst case is either an all-zero matrix, or a non-zero at the very last position.  In such a case, the `hasNonZero()` implementation will parse the whole matrix like `countNonZero()` would do. But we expect the performance to be the same in this case. And `ippCountInRange` is hard to beat !
      There is also the case of very small matrices (<=32x32...) in 8b, where the SIMD can be hard to feed.
      
      For all cases but the worse, my custom `hasNonZero()` performs better than `ippCountInRange()`
      For the worst case, my custom `hasNonZero()` performs better than `ippCountInRange()` *except for large matrices of type CV_32S or CV_64F* (but surprisingly, not CV_32F).
      The difference is small, but it exists (and I don't understand why).
      For very small CV_8U matrices `ippCountInRange()` seems unbeatable.
      
      Here is the code that I use to check timings
      
      ```
      
        //test cv::hasNonZero() vs (cv::countNonZero()>0) for different matrices sizes, types, strides...
        {
          cv::setRNGSeed(1234);
          const std::vector<cv::Size> sizes = {{32, 32}, {64, 64}, {128, 128}, {320, 240}, {512, 512}, {640, 480}, {1024, 768}, {2048, 2048}, {1031, 1000}};
          const std::vector<int> types = {CV_8U, CV_16U, CV_32S, CV_32F, CV_64F};
          const size_t iterations = 1000;
          for(const cv::Size& size : sizes)
          {
            for(const int type : types)
            {
              for(int c = 0 ; c<2 ; ++c)
              {
                const bool continuous = !c;
                for(int i = 0 ; i<4 ; ++i)
                {
                  cv::Mat m = continuous ? cv::Mat::zeros(size, type) : cv::Mat(cv::Mat::zeros(cv::Size(2*size.width, size.height), type), cv::Rect(cv::Point(0, 0), size));
                  const bool nz = (i <= 2);
                  const unsigned int nzOffsetRange = 10;
                  const unsigned int nzOffset = cv::randu<unsigned int>()%nzOffsetRange;
                  const cv::Point pos = 
                    (i == 0) ? cv::Point(nzOffset, 0) :
                    (i == 1) ? cv::Point(size.width/2-nzOffsetRange/2+nzOffset, size.height/2) :
                    (i == 2) ? cv::Point(size.width-1-nzOffset, size.height-1) :
                    cv::Point(0, 0);
                  std::cout << "============================================================" << std::endl;
                  std::cout << "size:" << size << "  type:" << type << "  continuous = " << (continuous ? "true" : "false") << "  iterations:" << iterations << "  nz=" << (nz ? "true" : "false");
                  std::cout << "  pos=" << ((i == 0) ? "begin" : (i == 1) ? "middle" : (i == 2) ? "end" : "none");
                  std::cout << std::endl;
                  cv::Mat mask = cv::Mat::zeros(size, CV_8UC1);
                  mask.at<unsigned char>(pos) = 0xFF;
                  m.setTo(cv::Scalar::all(0));
                  m.setTo(cv::Scalar::all(nz ? 1 : 0), mask);
                  std::vector<bool> results;
                  std::vector<double> timings;
      
                  {
                    bool res = false;
                    auto ref = cv::getTickCount();
                    for(size_t k = 0 ; k<iterations ; ++k)
                      res = cv::hasNonZero(m);
                    auto now = cv::getTickCount();
                    const bool error = (res != nz);
                    if (error)
                      printf("!!ERROR!!\r\n");
                    results.push_back(res);
                    timings.push_back(1000.*(now-ref)/cv::getTickFrequency());
                  }
                  {
                    bool res = false;
                    auto ref = cv::getTickCount();
                    for(size_t k = 0 ; k<iterations ; ++k)
                      res = (cv::countNonZero(m)>0);
                    auto now = cv::getTickCount();
                    const bool error = (res != nz);
                    if (error)
                      printf("!!ERROR!!\r\n");
                    results.push_back(res);
                    timings.push_back(1000.*(now-ref)/cv::getTickFrequency());
                  }
      
                  const size_t bestTimingIndex = (std::min_element(timings.begin(), timings.end())-timings.begin());
                  if ((bestTimingIndex != 0) || (std::find_if_not(results.begin(), results.end(), [&](bool r) {return (r == nz);}) != results.end()))
                  {
                    std::cout << "cv::hasNonZero\t\t=>" << results[0] << ((results[0] != nz) ? "  ERROR" : "") << "   perf:" << timings[0] << "ms => " << (iterations/timings[0]*1000) << " im/s" << ((bestTimingIndex == 0) ? " * " : "") << std::endl;
                    std::cout << "cv::countNonZero\t=>" << results[1] << ((results[1] != nz) ? "  ERROR" : "") << "   perf:" << timings[1] << "ms => " << (iterations/timings[1]*1000) << " im/s" << ((bestTimingIndex == 1) ? " * " : "") << std::endl;
                  }
                }
              }
            }
          }
        }
      
      ```
      
      Here is a report of this benchmark (it only reports timings when `cv::countNonZero()` is faster)
      My CPU is an Intel Core I7 4790 @ 3.60Ghz
      
      ```
      
      ============================================================
      size:[32 x 32]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      cv::hasNonZero          =>1   perf:0.353764ms => 2.82674e+06 im/s
      cv::countNonZero        =>1   perf:0.282044ms => 3.54555e+06 im/s *
      ============================================================
      size:[32 x 32]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      cv::hasNonZero          =>1   perf:0.610478ms => 1.63806e+06 im/s
      cv::countNonZero        =>1   perf:0.283182ms => 3.5313e+06 im/s *
      ============================================================
      size:[32 x 32]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      cv::hasNonZero          =>0   perf:0.630115ms => 1.58701e+06 im/s
      cv::countNonZero        =>0   perf:0.282044ms => 3.54555e+06 im/s *
      ============================================================
      size:[32 x 32]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      cv::hasNonZero          =>1   perf:0.607347ms => 1.64651e+06 im/s
      cv::countNonZero        =>1   perf:0.467037ms => 2.14116e+06 im/s *
      ============================================================
      size:[32 x 32]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      cv::hasNonZero          =>0   perf:0.618162ms => 1.6177e+06 im/s
      cv::countNonZero        =>0   perf:0.468175ms => 2.13595e+06 im/s *
      ============================================================
      size:[32 x 32]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[32 x 32]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[32 x 32]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[32 x 32]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[32 x 32]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[64 x 64]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[64 x 64]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[64 x 64]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[64 x 64]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[128 x 128]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[128 x 128]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[128 x 128]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[128 x 128]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[320 x 240]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[320 x 240]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[320 x 240]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[320 x 240]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[512 x 512]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[512 x 512]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[512 x 512]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[512 x 512]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[640 x 480]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[640 x 480]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[640 x 480]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[640 x 480]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1024 x 768]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1024 x 768]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1024 x 768]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1024 x 768]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      cv::hasNonZero          =>1   perf:895.381ms => 1116.84 im/s
      cv::countNonZero        =>1   perf:882.569ms => 1133.06 im/s *
      ============================================================
      size:[2048 x 2048]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      cv::hasNonZero          =>0   perf:899.53ms => 1111.69 im/s
      cv::countNonZero        =>0   perf:870.894ms => 1148.24 im/s *
      ============================================================
      size:[2048 x 2048]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[2048 x 2048]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      cv::hasNonZero          =>1   perf:2018.92ms => 495.313 im/s
      cv::countNonZero        =>1   perf:1966.37ms => 508.552 im/s *
      ============================================================
      size:[2048 x 2048]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      cv::hasNonZero          =>0   perf:2005.87ms => 498.537 im/s
      cv::countNonZero        =>0   perf:1992.78ms => 501.812 im/s *
      ============================================================
      size:[2048 x 2048]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[2048 x 2048]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[2048 x 2048]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[2048 x 2048]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:0  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:0  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:0  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:0  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:0  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:0  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:0  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:0  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:2  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:2  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:2  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:2  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:2  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:2  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:2  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:2  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:4  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:4  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:4  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:4  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:4  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:4  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:4  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:4  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:5  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:5  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:5  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:5  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:5  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:5  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:5  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:5  continuous = false  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:6  continuous = true  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:6  continuous = true  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:6  continuous = true  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:6  continuous = true  iterations:1000  nz=false  pos=none
      ============================================================
      size:[1031 x 1000]  type:6  continuous = false  iterations:1000  nz=true  pos=begin
      ============================================================
      size:[1031 x 1000]  type:6  continuous = false  iterations:1000  nz=true  pos=middle
      ============================================================
      size:[1031 x 1000]  type:6  continuous = false  iterations:1000  nz=true  pos=end
      ============================================================
      size:[1031 x 1000]  type:6  continuous = false  iterations:1000  nz=false  pos=none
      done
      
      ```
      60b806f9
    • Z
      Merge pull request #23763 from zihaomu:add_runtime_check · eec8a20c
      Zihao Mu 提交于
      DNN: fix bug for X86 Winograd #23763
      
      Address https://github.com/opencv/opencv/issues/23760
      The patch aims to add a runtime check for X86 platform without AVX(2).
      
      ### Pull Request Readiness Checklist
      
      See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
      
      - [x] I agree to contribute to the project under Apache 2 License.
      - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
      - [x] The PR is proposed to the proper branch
      - [ ] There is a reference to the original bug report and related work
      - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
            Patch to opencv_extra has the same branch name.
      - [ ] The feature is well documented and sample code can be built with the project CMake
      eec8a20c
  6. 08 6月, 2023 2 次提交
  7. 07 6月, 2023 4 次提交
  8. 06 6月, 2023 1 次提交
  9. 05 6月, 2023 1 次提交
  10. 04 6月, 2023 1 次提交
  11. 02 6月, 2023 3 次提交
  12. 01 6月, 2023 1 次提交
  13. 31 5月, 2023 1 次提交
  14. 30 5月, 2023 3 次提交
    • D
      Merge pull request #23597 from dmatveev:dm/gapi_onnx_py_integration · fc5d412b
      Dmitry Matveev 提交于
      G-API: Integration branch for ONNX & Python-related changes #23597
      
      # Changes overview
      
      ## 1. Expose ONNX backend's Normalization and Mean-value parameters in Python
      
      * Since Python G-API bindings rely on `Generic` infer to express Inference, the `Generic` specialization of `onnx::Params` was extended with new methods to control normalization (`/255`) and mean-value; these methods were exposed in the Python bindings
      * Found some questionable parts in the existing API which I'd like to review/discuss (see comments)
      
      UPD:
      1. Thanks to @TolyaTalamanov normalization inconsistencies have been identified with `squeezenet1.0-9` ONNX model itself; tests using these model were updated to DISABLE normalization and NOT using mean/value.
      2. Questionable parts were removed and tests still pass.
      
      ### Details (taken from @TolyaTalamanov's comment):
      
      `squeezenet1.0.*onnx` - doesn't require scaling to [0,1] and mean/std because the weights of the first convolution already scaled. ONNX documentation is broken. So the correct approach to use this models is:
      
      1. ONNX: apply preprocessing from the documentation: https://github.com/onnx/models/blob/main/vision/classification/imagenet_preprocess.py#L8-L44 but without normalization step:
      ```
      # DON'T DO IT:
      # mean_vec = np.array([0.485, 0.456, 0.406])
      # stddev_vec = np.array([0.229, 0.224, 0.225])
      # norm_img_data = np.zeros(img_data.shape).astype('float32')
      # for i in range(img_data.shape[0]):
      #     norm_img_data[i,:,:] = (img_data[i,:,:]/255 - mean_vec[i]) / stddev_vec[i]
      #     # add batch channel
      #     norm_img_data = norm_img_data.reshape(1, 3, 224, 224).astype('float32')
      #     return norm_img_data
      
      # INSTEAD
      return img_data.reshape(1, 3, 224, 224)
      ```
      
      2. G-API: Convert image from BGR to RGB and then pass to `apply` as-is with configuring parameters:
      ```
      net = cv.gapi.onnx.params('squeezenet', model_filename)
      net.cfgNormalize('data_0', False)
      ```
      **Note**: Results might be difference because `G-API` doesn't apply central crop but just do resize to model resolution.
      
      ---
      
      `squeezenet1.1.*onnx` - requires scaling to [0,1] and mean/std - onnx documentation is correct.
      1. ONNX: apply preprocessing from the documentation: https://github.com/onnx/models/blob/main/vision/classification/imagenet_preprocess.py#L8-L44
      2. G-API: Convert image from BGR to RGB and then pass to `apply` as-is with configuring parameters:
      ```
      net = cv.gapi.onnx.params('squeezenet', model_filename)
      net.cfgNormalize('data_0', True) // default
      net.cfgMeanStd('data_0', [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
      ```
      **Note**: Results might be difference because `G-API` doesn't apply central crop but just do resize to model resolution.
      
      ## 2. Expose Fluid & kernel package-related functionality in Python
      
      * `cv::gapi::combine()`
      * `cv::GKernelPackage::size()` (mainly for testing purposes)
      * `cv::gapi::imgproc::fluid::kernels()`
      
      Added a test for the above.
      
      ## 3. Fixed issues with Python stateful kernel handling
      
      Fixed error message when `outMeta()` of custom python operation fails.
      
      ## 4. Fixed various issues in Python tests
      
      1. `test_gapi_streaming.py` - fixed behavior of Desync test to avoid sporadic issues
      2. `test_gapi_infer_onnx.py` - fixed model lookup (it was still using the ONNX Zoo layout but was NOT using the proper env var we use to point to one).
      
      ### Pull Request Readiness Checklist
      
      See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
      
      - [x] I agree to contribute to the project under Apache 2 License.
      - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
      - [x] The PR is proposed to the proper branch
      - [x] There is a reference to the original bug report and related work
      - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
            Patch to opencv_extra has the same branch name.
      - [x] The feature is well documented and sample code can be built with the project CMake
      fc5d412b
    • P
      Merge pull request #23690 from chacha21:rotatedRectangleIntersection_precision · 93d49021
      Pierre Chatelier 提交于
      better accuracy for _rotatedRectangleIntersection() (proposal for #23546) #23690
      
      _rotatedRectangleIntersection() can be (statically) customized to use double instead of float for better accuracy
      this is a proposal for experimentation around #23546
      
      for better accuracy, _rotatedRectangleIntersection() could use double. It will still return cv::Point2f list for backward compatibility, but the inner computations are controlled by a typedef
      
      - [X] I agree to contribute to the project under Apache 2 License.
      - [X] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
      - [X] The PR is proposed to the proper branch
      - [X] There is a reference to the original bug report and related work
      - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
            Patch to opencv_extra has the same branch name.
      - [x] The feature is well documented and sample code can be built with the project CMake
      93d49021
    • O
      Addition of normalize_axis to ONNXImporter::parseSqueeze to support negative... · 0442c6fa
      Olivier Hotel 提交于
      Addition of normalize_axis to ONNXImporter::parseSqueeze to support negative values for the axes attribut.
      
      Negative values are part of the ONNX optset>=11.
      Signed-off-by: NOlivier Hotel <olivier.hotel@orange.com>
      0442c6fa
  15. 29 5月, 2023 2 次提交
  16. 27 5月, 2023 2 次提交
    • T
      Update setup.py · 1bffe170
      triple Mu 提交于
      Fix error:
      UnboundLocalError: local variable 'typing_stub_files' referenced before assignment
      1bffe170
    • S
      Fixed UBSan warning about undefined pointer arithmetic overflow · 2083fdc9
      Sean McBride 提交于
      Pointer arithmetic overflow is always undefined, whether signed or unsigned.
      
      It warned here:
      
      `Addition of unsigned offset to 0x00017fd31b97 overflowed to 0x00017fd30c97`
      
      Convert the offset to a signed number, so that we can offset either forward or backwards.
      
      In my own use of OpenCV at least, this is the only case of pointer arithmetic overflow.
      2083fdc9
  17. 26 5月, 2023 4 次提交
  18. 25 5月, 2023 2 次提交