Advertisement
bartek27210

techniki multimedialne

Mar 18th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
  4. #include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
  5. #include <opencv2/highgui/highgui.hpp>
  6. #include <stdio.h>
  7. #include <math.h>
  8. #include <iostream>
  9.  
  10. using namespace std;
  11. using namespace cv;
  12. float zmiana=0.02f;
  13. char k;
  14. /*bool Diffuse(Mat_<uchar> &peppersPixels, Mat_<uchar> &fruitsPixels,
  15.                 Mat_<uchar> &imagesDiffusionPixels, float ratio);*/
  16.  
  17. bool Diffuse(Mat_<Vec3b> &peppersPixels, Mat_<Vec3b> &fruitsPixels,
  18.                 Mat_<Vec3b> &imagesDiffusionPixels, float ratio);
  19.  
  20. int _tmain(int argc, _TCHAR* argv[])
  21. {
  22.     // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
  23.     cvNamedWindow("Przenikanie się obrazów", CV_WINDOW_AUTOSIZE);
  24.    
  25.     // Pobranie obrazu 1a
  26.     Mat imagePeppers = imread("peppers.jpg",CV_LOAD_IMAGE_COLOR);
  27.     Mat imageFruits = imread("fruits.jpg",CV_LOAD_IMAGE_COLOR);
  28.  
  29.     // Utworzenie obiektu przechowującego obraz, który będzie wynikiem przenikania
  30.     Mat imagesDiffusion = imagePeppers.clone();
  31.  
  32.     // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  33.     /*
  34.     Mat_<uchar> peppersPixels = imagePeppers;
  35.     Mat_<uchar> fruitsPixels = imageFruits;
  36.     Mat_<uchar> imagesDiffusionPixels = imagesDiffusion;
  37.     */
  38.  
  39.     Mat_<Vec3b> peppersPixels = imagePeppers;
  40.     Mat_<Vec3b> fruitsPixels = imageFruits;
  41.     Mat_<Vec3b> imagesDiffusionPixels = imagesDiffusion;
  42.    
  43.     int k = cvWaitKey(1);
  44.      
  45.     do
  46.     {
  47.         float ratio = 1.0f;    
  48.        
  49.         for(ratio; ratio>0.0f; ratio-=zmiana)
  50.         {
  51.            
  52.             // Przenikanie obrazów
  53.             if(Diffuse(peppersPixels, fruitsPixels, imagesDiffusionPixels, ratio) == true)
  54.                 goto end;
  55.  
  56.             // Wyświetlanie obrazu
  57.             imshow("Przenikanie się obrazów", imagesDiffusion);
  58.         }
  59.  
  60.         //TODO: tutaj stworzyć drugą pętlę for zmieniającą ratio
  61.  
  62.         for(ratio=0.0f; ratio<1.0f; ratio+=zmiana)
  63.         {
  64.    
  65.             if(Diffuse(peppersPixels, fruitsPixels, imagesDiffusionPixels, ratio) == true)
  66.                 goto end;      
  67.  
  68.             imshow("Przenikanie się obrazów", imagesDiffusion);
  69.         }
  70.     }
  71.     while(true);
  72.  
  73. end:
  74.  
  75.     // Niszczenie okna
  76.     cvDestroyWindow("Przenikanie się obrazów");
  77.     return 0;
  78. }
  79.  
  80. /*bool Diffuse(Mat_<uchar> &peppersPixels, Mat_<uchar> &fruitsPixels,
  81.                 Mat_<uchar> &imagesDiffusionPixels, float ratio)*/
  82.  
  83. bool Diffuse(Mat_<Vec3b> &peppersPixels, Mat_<Vec3b> &fruitsPixels,
  84.                 Mat_<Vec3b> &imagesDiffusionPixels, float ratio)
  85. {  
  86.    
  87.     /* Funkcja przenikająca obrazy peppersPixels oraz fruitsPixels (mają one ten sam rozmiar).
  88.     Parametr ratio jest wpółczynnikiem przenikania i powinien zmieniać wartość w zakresie od 1 do 0 z krokiem 0.01.
  89.     Obraz powinien przechodzić w kolejności od peppersPixels do fruitsPixels, następnie od fruitsPixels
  90.     do peppersPixels i od początku.
  91.     Wynikowy obraz zostaje zapisywany w imagesDiffusionPixels.
  92.     */
  93.         for(int i = 0; i<peppersPixels.rows; i++){
  94.         for(int j = 0 ; j<peppersPixels.cols; j++){
  95.             //imagesDiffusionPixels[i][j]=peppersPixels[i][j]*ratio+fruitsPixels[i][j]*(1-ratio);
  96.             imagesDiffusionPixels[i][j].val[0]=peppersPixels[i][j].val[0]*ratio+fruitsPixels[i][j].val[0]*(1-ratio);
  97.             imagesDiffusionPixels[i][j].val[1]=peppersPixels[i][j].val[1]*ratio+fruitsPixels[i][j].val[1]*(1-ratio);
  98.             imagesDiffusionPixels[i][j].val[2]=peppersPixels[i][j].val[2]*ratio+fruitsPixels[i][j].val[2]*(1-ratio);
  99.         }
  100.  
  101.     }
  102.         /*
  103.     1 etap ćwiczenia: Należy przetwarzać obrazy szare - 1-kanałowe.
  104.     2 etap ćwiczenia: Należy przetwarzać obrazy 3-kanałowe (RGB) w 3 zagnieżdżonych pętlach
  105.                       (każdy wiersz, kolumna, kanał). Do wykonania tego etapu należy wprowadzić zmiany
  106.                       również poza funkcją Diffuse.*/
  107.    
  108.     // TODO: przenikanie się pikseli obrazu
  109.  
  110.     // Na końcu funkcja powinna oczekiwać 1 milisekundę na wciśnięcie klawisza Esc lub Enter.
  111.     // Jeśli użytkownik wciśnie któryś z wymienionych klawiszy, funkcja powinna zwrócić wartość true.
  112.    
  113.     // TODO: oczenikawnie przez 1 milisekundę na klawisz
  114.     int k = cvWaitKey(1);
  115.     if(k == 27 || k == 13) return true;
  116.  
  117.     if(k == 43 && zmiana<0.1f ) zmiana+=0.002f;
  118.     else if(k==45 && zmiana>0.0f) zmiana-=0.002f;
  119.     cout<<zmiana;
  120.     return false;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement