Advertisement
sildren12

TM LAB 3

Mar 27th, 2017
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.77 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. int prewit[3][3]={{1,1,1},{0,0,0},{-1,-1,-1}};
  14. int prewit_pion[3][3]={{-1,0,1},{-1,0,1},{-1,0,1}};
  15.  
  16. void detectEdges(Mat_<uchar> &peppersPixels, Mat_<uchar> &handEdgesMergedPixels, int centerX, int centerY);
  17.  
  18. int _tmain(int argc, _TCHAR* argv[])
  19. {
  20.     // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
  21.     cvNamedWindow("Wykrywanie krawędzi", CV_WINDOW_AUTOSIZE);
  22.    
  23.     // Pobranie obrazu
  24.     Mat imagePeppers = imread("hand.jpg",CV_LOAD_IMAGE_GRAYSCALE);
  25.  
  26.     // Utworzenie obiektu przechowującego obraz z wyznaczonymi krawędziami
  27.     Mat handEdgesMerged = imagePeppers.clone();
  28.  
  29.     // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  30.     Mat_<uchar> handPixels = imagePeppers;
  31.     Mat_<uchar> handEdgesMergedPixels = handEdgesMerged;
  32.  
  33.     // Wyznaczenie wpółrzędnych środa obrazu
  34.     int centerX = handPixels.cols/2;
  35.     int centerY = handPixels.rows/2;
  36.  
  37.     // Obracanie obrazu
  38.     detectEdges(handPixels, handEdgesMergedPixels, centerX, centerY);
  39.  
  40.     // Wyświetlanie obrazu
  41.     imshow("Wykrywanie krawędzi", handEdgesMerged);
  42.  
  43.     // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
  44.     char key;
  45.     do  key = cvWaitKey(1);
  46.     while(key != 27 && key != 13);
  47.  
  48.     // Niszczenie okna
  49.     cvDestroyWindow("Wykrywanie krawędzi");
  50.     return 0;
  51. }
  52.  
  53. void detectEdges(Mat_<uchar> &handPixels, Mat_<uchar> &handEdgesMergedPixels, int centerX, int centerY)
  54. {
  55.     /* Funkcja wyznaczająca krawędzie za pomocą maski morfologicznej podanej przez prowadzącego.
  56.     Wyznaczane są najpierw krawędzie pionowe, później poziome. Następnie wykonywane jest scalenie
  57.     krawędzi pionowych i poziomych, przeskalowanie obrazu scalonego do zakresu 0-255 oraz binaryzacja
  58.     z eksperymentalnie dobranym progiem.
  59.     Wynikowy obraz zostaje zapisany w handEdgesMergedPixels.*/
  60.    
  61.     // Utworzenie obiektów przechowujących obrazy z wyznaczonymi krawędziami: pionowymi i poziomymi
  62.     Mat handEdgesVertical = handPixels.clone();
  63.     Mat handEdgesHorizontal = handPixels.clone();
  64.  
  65.     // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  66.     Mat_<int> handEdgesVerticalPixels = handEdgesVertical;
  67.     Mat_<int> handEdgesHorizontalPixels = handEdgesHorizontal;
  68.  
  69.     // TODO
  70.     int x_min= 0; int x_max=0; int xp_min=0; int xp_max=0; int c_max=0; int c_min=0;
  71.  
  72.     for( int i = 1; i<handPixels.rows-1; i++){
  73.         for( int j =1; j<handPixels.cols-1; j++) {
  74.            
  75.             int suma = 0;
  76.             int suma_pion= 0;
  77.             int suma_cala;
  78.             for ( int x = 0; x<3; x++)
  79.                 for( int y=0; y<3; y++)
  80.                 {
  81.                     suma+=handPixels[i+x-1][j+y-1]*prewit[x][y];
  82.                     suma_pion+=handPixels[i+x-1][j+y-1]*prewit_pion[x][y];
  83.                 }
  84.  
  85.                 suma = abs(suma);
  86.                 if( suma < x_min) x_min= suma;
  87.                 if( suma > x_max) x_max= suma;
  88.  
  89.                 suma_pion = abs(suma_pion);
  90.                 if( suma_pion < xp_min) xp_min= suma_pion;
  91.                 if( suma_pion > xp_max) xp_max= suma_pion;
  92.  
  93.                 handEdgesVerticalPixels [i][j] = suma;
  94.                 handEdgesHorizontalPixels [i][j] = suma_pion;
  95.  
  96.                 suma_cala=abs(suma+suma_pion);
  97.                 if( suma_cala < c_min) c_min= suma_cala;
  98.                 if( suma_cala > c_max) c_max= suma_cala;
  99.  
  100.         }
  101.     }
  102.     for( int xx = 0; xx<handPixels.rows; xx++){
  103.         for( int yy = 0; yy<handPixels.cols; yy++) {
  104.             //handEdgesVerticalPixels[xx][yy]= ((handEdgesVerticalPixels[xx][yy]-x_min)*255)/(x_max-x_min);
  105.             //handEdgesHorizontalPixels[xx][yy]= ((handEdgesHorizontalPixels[xx][yy]-xp_min)*255)/(xp_max-xp_min);
  106.             handEdgesMergedPixels[xx][yy]= ((handEdgesVerticalPixels[xx][yy] + handEdgesHorizontalPixels[xx][yy]-c_min)*255)/(c_max-c_min);
  107.         }
  108.     }
  109.     handEdgesMergedPixels = handEdgesMergedPixels;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement