Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur
- #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
- #include <opencv2/highgui/highgui.hpp>
- #include <stdio.h>
- #include <math.h>
- #include <iostream>
- using namespace std;
- using namespace cv;
- bool Diffuse(Mat_<Vec3b> &peppersPixels, Mat_<Vec3b> &fruitsPixels,
- Mat_<Vec3b> &imagesDiffusionPixels, float ratio);
- int _tmain(int argc, _TCHAR* argv[])
- {
- // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
- cvNamedWindow("Przenikanie się obrazów", CV_WINDOW_AUTOSIZE);
- // Pobranie obrazu
- Mat imagePeppers = imread("peppers.jpg",3);
- Mat imageFruits = imread("fruits.jpg",3 );
- // Utworzenie obiektu przechowującego obraz, który będzie wynikiem przenikania
- Mat imagesDiffusion = imagePeppers.clone();
- // Uzyskanie macierzy pikseli na podstawie obiektów Mat
- Mat_<Vec3b> peppersPixels = imagePeppers;
- Mat_<Vec3b> fruitsPixels = imageFruits;
- Mat_<Vec3b> imagesDiffusionPixels = imagesDiffusion;
- do
- {
- float ratio = 1.0f;
- for(ratio;ratio>0.0f;ratio-=0.02f)
- {
- // Przenikanie obrazów
- if(Diffuse(peppersPixels, fruitsPixels, imagesDiffusionPixels, ratio) == true)
- goto end;
- // Wyświetlanie obrazu
- imshow("Przenikanie się obrazów", imagesDiffusion);
- }
- /*TODO: tutaj stworzyć drugą pętlę for zmieniającą ratio*/
- for(ratio;ratio<1.0f;ratio+=0.02f)
- {
- // Przenikanie obrazów
- if(Diffuse(peppersPixels, fruitsPixels, imagesDiffusionPixels, ratio) == true)
- goto end;
- // Wyświetlanie obrazu
- imshow("Przenikanie się obrazów", imagesDiffusion);
- }
- }
- while(true);
- end:
- // Niszczenie okna
- cvDestroyWindow("Przenikanie się obrazów");
- return 0;
- }
- bool Diffuse(Mat_<Vec3b> &peppersPixels, Mat_<Vec3b> &fruitsPixels,
- Mat_<Vec3b> &imagesDiffusionPixels, float ratio)
- {
- /* Funkcja przenikająca obrazy peppersPixels oraz fruitsPixels (mają one ten sam rozmiar).
- Parametr ratio jest wpółczynnikiem przenikania i powinien zmieniać wartość w zakresie od 1 do 0 z krokiem 0.01.
- Obraz powinien przechodzić w kolejności od peppersPixels do fruitsPixels, następnie od fruitsPixels
- do peppersPixels i od początku.
- Wynikowy obraz zostaje zapisywany w imagesDiffusionPixels.
- 1 etap ćwiczenia: Należy przetwarzać obrazy szare - 1-kanałowe.
- 2 etap ćwiczenia: Należy przetwarzać obrazy 3-kanałowe (RGB) w 3 zagnieżdżonych pętlach
- (każdy wiersz, kolumna, kanał). Do wykonania tego etapu należy wprowadzić zmiany
- również poza funkcją Diffuse.*/
- // TODO: przenikanie się pikseli obrazu
- for(int i=0;i<peppersPixels.rows;i++)
- for(int j=0;j<peppersPixels.cols;j++)
- for(int k=0;k<peppersPixels.channels();k++)
- imagesDiffusionPixels[i][j][k]=peppersPixels[i][j][k]*ratio + fruitsPixels[i][j][k]*(1-ratio);
- // Na końcu funkcja powinna oczekiwać 1 milisekundę na wciśnięcie klawisza Esc lub Enter.
- // Jeśli użytkownik wciśnie któryś z wymienionych klawiszy, funkcja powinna zwrócić wartość true.
- // TODO: oczenikawnie przez 1 milisekundę na klawisz
- int znak = cvWaitKey(1);
- if(znak==13||znak==27)
- return true;
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement