Advertisement
pabloducato

CWICZENIE_NR_1_PRZENIKANIE_SIE_OBRAZOW

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