Advertisement
sildren12

TM Lab 1

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