乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      opencv psnr計算

       昵稱14216904 2016-02-18
      http://www./opencvdoc/2.3.2/html/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html#windows-visual-studio-how-to

      // Video Image PSNR and SSIM
      #include <iostream> // for standard I/O
      #include <string>   // for strings
      #include <iomanip>  // for controlling float print precision
      #include <sstream>  // string to number conversion

      #include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
      #include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
      #include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O

      using namespace std;
      using namespace cv;

      double getPSNR ( const Mat& I1, const Mat& I2);
      Scalar getMSSIM( const Mat& I1, const Mat& I2);

      void help()
      {
          cout
              << "\n--------------------------------------------------------------------------" << endl
              << "This program shows how to read a video file with OpenCV. In addition, it tests the"
              << " similarity of two input videos first with PSNR, and for the frames below a PSNR "  << endl
              << "trigger value, also with MSSIM."<< endl
              << "Usage:"                                                                       << endl
              << "./video-source referenceVideo useCaseTestVideo PSNR_Trigger_Value Wait_Between_Frames " << endl
              << "--------------------------------------------------------------------------"   << endl
              << endl;
      }
      int main(int argc, char *argv[], char *window_name)
      {
          help();
          if (argc != 5)
          {
              cout << "Not enough parameters" << endl;
              return -1;
          }
          stringstream conv;

          const string sourceReference = argv[1],sourceCompareWith = argv[2];
          int psnrTriggerValue, delay;
          conv << argv[3] << argv[4];       // put in the strings
          conv >> psnrTriggerValue >> delay;// take out the numbers

          char c;
          int frameNum = -1;          // Frame counter

          VideoCapture captRefrnc(sourceReference),
                       captUndTst(sourceCompareWith);

          if ( !captRefrnc.isOpened())
          {
              cout  << "Could not open reference " << sourceReference << endl;
              return -1;
          }

          if( !captUndTst.isOpened())
          {
              cout  << "Could not open case test " << sourceCompareWith << endl;
              return -1;
          }

          Size refS = Size((int) captRefrnc.get(CV_CAP_PROP_FRAME_WIDTH),
                           (int) captRefrnc.get(CV_CAP_PROP_FRAME_HEIGHT)),
               uTSi = Size((int) captUndTst.get(CV_CAP_PROP_FRAME_WIDTH),
                           (int) captUndTst.get(CV_CAP_PROP_FRAME_HEIGHT));

          if (refS != uTSi)
          {
              cout << "Inputs have different size!!! Closing." << endl;
              return -1;
          }

          const char* WIN_UT = "Under Test";
          const char* WIN_RF = "Reference";

          // Windows
                  namedWindow(WIN_RF, CV_WINDOW_AUTOSIZE );
                  namedWindow(WIN_UT, CV_WINDOW_AUTOSIZE );
                  cvMoveWindow(WIN_RF, 400       ,            0);      //750,  2 (bernat =0)
                  cvMoveWindow(WIN_UT, refS.width,            0);      //1500, 2

          cout << "Frame resolution: Width=" << refS.width << "  Height=" << refS.height
               << " of nr#: " << captRefrnc.get(CV_CAP_PROP_FRAME_COUNT) << endl;

          cout << "PSNR trigger value " <<
                setiosflags(ios::fixed) << setprecision(3) << psnrTriggerValue << endl;

          Mat frameReference, frameUnderTest;
          double psnrV;
          Scalar mssimV;

          while( true) //Show the image captured in the window and repeat
          {
              captRefrnc >> frameReference;
              captUndTst >> frameUnderTest;

              if( frameReference.empty()  || frameUnderTest.empty())
              {
                  cout << " < < <  Game over!  > > > ";
                  break;
              }

              ++frameNum;
              cout <<"Frame:" << frameNum;

              ///////////////////////////////// PSNR ////////////////////////////////////////////////////
              psnrV = getPSNR(frameReference,frameUnderTest);                 //get PSNR
              cout << setiosflags(ios::fixed) << setprecision(3) << psnrV << "dB";

              //////////////////////////////////// MSSIM /////////////////////////////////////////////////
              if (psnrV < psnrTriggerValue)
              {
                  mssimV = getMSSIM(frameReference,frameUnderTest);

                  cout << " MSSIM: "
                       << "R" << setiosflags(ios::fixed) << setprecision(3) << mssimV.val[2] * 100
                       << "G" << setiosflags(ios::fixed) << setprecision(3) << mssimV.val[1] * 100
                       << "B" << setiosflags(ios::fixed) << setprecision(3) << mssimV.val[0] * 100;
              }

             cout << endl;

              ////////////////////////////////// Show Image /////////////////////////////////////////////
              imshow( WIN_RF, frameReference);
              imshow( WIN_UT, frameUnderTest);

              c = cvWaitKey(delay);
              if (c == 27) break;
          }

          return 0;
      }

      double getPSNR(const Mat& I1, const Mat& I2)
      {
          Mat s1;
          absdiff(I1, I2, s1);       // |I1 - I2|
          s1.convertTo(s1, CV_32F);  // cannot make a square on 8 bits
          s1 = s1.mul(s1);           // |I1 - I2|^2

          Scalar s = sum(s1);         // sum elements per channel

          double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels


          if( sse <= 1e-10) // for small values return zero
              return 0;
          else
          {
              double  mse =sse /(double)(I1.channels() * I1.total());
              double psnr = 10.0*log10((255*255)/mse);
              return psnr;
          }
      }

      Scalar getMSSIM( const Mat& i1, const Mat& i2)
      {
          const double C1 = 6.5025, C2 = 58.5225;
          /***************************** INITS **********************************/
          int d     = CV_32F;

          Mat I1, I2;
          i1.convertTo(I1, d);           // cannot calculate on one byte large values
          i2.convertTo(I2, d);

          Mat I2_2   = I2.mul(I2);        // I2^2
          Mat I1_2   = I1.mul(I1);        // I1^2
          Mat I1_I2  = I1.mul(I2);        // I1 * I2

          /*************************** END INITS **********************************/

          Mat mu1, mu2;   // PRELIMINARY COMPUTING
          GaussianBlur(I1, mu1, Size(11, 11), 1.5);
          GaussianBlur(I2, mu2, Size(11, 11), 1.5);

          Mat mu1_2   =   mu1.mul(mu1);
          Mat mu2_2   =   mu2.mul(mu2);
          Mat mu1_mu2 =   mu1.mul(mu2);

          Mat sigma1_2, sigma2_2, sigma12;

          GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
          sigma1_2 -= mu1_2;

          GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
          sigma2_2 -= mu2_2;

          GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
          sigma12 -= mu1_mu2;

          ///////////////////////////////// FORMULA ////////////////////////////////
          Mat t1, t2, t3;

          t1 = 2 * mu1_mu2 + C1;
          t2 = 2 * sigma12 + C2;
          t3 = t1.mul(t2);         
           // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))

          t1 = mu1_2 + mu2_2 + C1;
          t2 = sigma1_2 + sigma2_2 + C2;
          t1 = t1.mul(t2);               // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))

          Mat ssim_map;
          divide(t3, t1, ssim_map);      // ssim_map =  t3./t1;

          Scalar mssim = mean( ssim_map ); // mssim = average of ssim map
          return mssim;
      }

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多