Advertisement
pabloducato

CWICZENIE_NR_3_DETEKCJA_KRAWEDZI

Jun 8th, 2019
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.31 KB | None | 0 0
  1. #include "stdafx.h" //CWICZENIE NR 3 DETEKCJA KRAWEDZI
  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. void detectEdges(Mat_<uchar> &peppersPixels, Mat_<uchar> &handEdgesMergedPixels, int centerX, int centerY);
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14.     // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
  15.     cvNamedWindow("Wykrywanie krawędzi", CV_WINDOW_AUTOSIZE);
  16.     // Pobranie obrazu ZADANIE NR 1 Wczytać do pamięci obraz JPEG hand.jpg
  17.     Mat imagePeppers = imread("hand.jpg",CV_LOAD_IMAGE_GRAYSCALE);
  18.     // Utworzenie obiektu przechowującego obraz z wyznaczonymi krawędziami
  19.     Mat handEdgesMerged = imagePeppers.clone();
  20.     // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  21.     Mat_<uchar> handPixels = imagePeppers;
  22.     Mat_<uchar> handEdgesMergedPixels = handEdgesMerged;
  23.     // Wyznaczenie wpółrzędnych środa obrazu
  24.     int centerX = handPixels.cols/2;
  25.     int centerY = handPixels.rows/2;
  26.     // Obracanie obrazu
  27.     detectEdges(handPixels, handEdgesMergedPixels, centerX, centerY);
  28.     // Wyświetlanie obrazu
  29.     imshow("Wykrywanie krawędzi", handEdgesMerged);
  30.     // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
  31.     char key;
  32.     do  key = cvWaitKey(1);
  33.     while(key != 27 && key != 13);
  34.     // Niszczenie okna
  35.     cvDestroyWindow("Wykrywanie krawędzi");
  36.     return 0;
  37. }
  38.  
  39. void detectEdges(Mat_<uchar> &handPixels, Mat_<uchar> &handEdgesMergedPixels, int centerX, int centerY)
  40. {
  41.     /* Funkcja wyznaczająca krawędzie za pomocą maski morfologicznej podanej przez prowadzącego.
  42.     Wyznaczane są najpierw krawędzie pionowe, później poziome. Następnie wykonywane jest scalenie
  43.     krawędzi pionowych i poziomych, przeskalowanie obrazu scalonego do zakresu 0-255 oraz binaryzacja
  44.     z eksperymentalnie dobranym progiem.
  45.     Wynikowy obraz zostaje zapisany w handEdgesMergedPixels.*/
  46.     //handEdgesHorizontal = ;
  47.     //handEdgesMergedPixels = handEdgesHorizontal;
  48.     // Utworzenie obiektów przechowujących obrazy z wyznaczonymi krawędziami: pionowymi i poziomymi
  49.     Mat handEdgesVertical = handPixels.clone();
  50.     Mat handEdgesHorizontal = handPixels.clone();
  51.     // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  52.     Mat_<int> handEdgesVerticalPixels = handEdgesVertical;
  53.     Mat_<int> handEdgesHorizontalPixels = handEdgesHorizontal;// TODO
  54.     /*static int sobel_horizontal[3][3]=
  55.     {
  56.         {1,1,1},
  57.         {0,0,0},
  58.         {-1,-1,-1}
  59.  
  60.     };*/
  61.     /*static int sobel_horizontal[3][3]=
  62.     {
  63.         {1,2,1},
  64.         {0,0,0},
  65.         {-1,-2,-1}
  66.  
  67.     };*/
  68.     static int sobel_vertical[3][3]=
  69.     {
  70.         {1,0,-1},
  71.         {2,0,-2},
  72.         {1,0,-1}
  73.     };
  74.     static int sobel_horizontal[3][3]=
  75.     {
  76.         {1,2,1},
  77.         {0,0,0},
  78.         {-1,-2,-1}
  79.     };
  80.     //HORIZONTAL (POZIOMO)
  81.     for(int y = 1; y < handEdgesHorizontalPixels.rows - 1; y++)
  82.     {
  83.         for(int x = 1; x < handEdgesHorizontalPixels.cols - 1; x++)
  84.         {
  85.             int suma =
  86.             handPixels[y-1][x-1]* sobel_horizontal[0][0] +
  87.             handPixels[y-1][x]* sobel_horizontal[0][1] +
  88.             handPixels[y-1][x+1]* sobel_horizontal[0][2] +
  89.             handPixels[y][x-1]* sobel_horizontal[1][0] +
  90.             handPixels[y][x]* sobel_horizontal[1][1] +
  91.             handPixels[y][x+1]* sobel_horizontal[1][2] +
  92.             handPixels[y+1][x-1]* sobel_horizontal[2][0] +
  93.             handPixels[y+1][x]* sobel_horizontal[2][1] +
  94.             handPixels[y+1][x+1]* sobel_horizontal[2][2];
  95.             handEdgesHorizontalPixels[y][x] = abs(suma);
  96.         }
  97.     }
  98.     int minimum = handEdgesHorizontalPixels[0][0];
  99.     int maximum = handEdgesHorizontalPixels[0][0];
  100.     for(int i=0; i < handEdgesHorizontalPixels.rows; i++)
  101.     {
  102.         for (int j=0; j < handEdgesHorizontalPixels.cols; j++)
  103.         {
  104.             if (handEdgesHorizontalPixels[i][j] < minimum)
  105.             {
  106.                 minimum = handEdgesHorizontalPixels[i][j];
  107.             }
  108.             if (handEdgesHorizontalPixels[i][j] > maximum)
  109.             {
  110.                 maximum = handEdgesHorizontalPixels[i][j];
  111.             }
  112.         }
  113.     }
  114.     for(int y=1; y < handEdgesHorizontalPixels.rows - 1; y++)
  115.     {
  116.         for (int x=1; x < handEdgesHorizontalPixels.cols - 1; x++)
  117.         {
  118.             handEdgesHorizontalPixels[y][x] = ((handEdgesHorizontalPixels[y][x]-minimum)*255)/(maximum-minimum);
  119.         }
  120.     }
  121.     //VERTICAL (PIONOWO)
  122.     for(int y = 1; y < handEdgesVerticalPixels.rows - 1; y++)
  123.     {
  124.         for(int x = 1; x < handEdgesVerticalPixels.cols - 1; x++)
  125.         {
  126.             int suma =
  127.             handPixels[y-1][x-1]* sobel_vertical[0][0] +
  128.             handPixels[y-1][x]* sobel_vertical[0][1] +
  129.             handPixels[y-1][x+1]* sobel_vertical[0][2] +
  130.             handPixels[y][x-1]* sobel_vertical[1][0] +
  131.             handPixels[y][x]* sobel_vertical[1][1] +
  132.             handPixels[y][x+1]* sobel_vertical[1][2] +
  133.             handPixels[y+1][x-1]* sobel_vertical[2][0] +
  134.             handPixels[y+1][x]* sobel_vertical[2][1] +
  135.             handPixels[y+1][x+1]* sobel_vertical[2][2];
  136.             handEdgesVerticalPixels[y][x] = abs(suma);
  137.         }
  138.     }
  139.     for(int i=0; i < handEdgesVerticalPixels.rows; i++)
  140.     {
  141.         for (int j=0; j < handEdgesVerticalPixels.cols; j++)
  142.         {
  143.             if (handEdgesVerticalPixels[i][j] < minimum)
  144.             {
  145.                 minimum = handEdgesVerticalPixels[i][j];
  146.             }
  147.             if (handEdgesVerticalPixels[i][j] > maximum)
  148.             {
  149.                 maximum = handEdgesVerticalPixels[i][j];
  150.             }
  151.         }
  152.     }
  153.     for(int y=0; y < handEdgesVerticalPixels.rows - 1; y++)
  154.     {
  155.         for (int x=0; x < handEdgesVerticalPixels.cols - 1; x++)
  156.         {
  157.             handEdgesVerticalPixels[y][x] = ((handEdgesVerticalPixels[y][x]-minimum)*255)/(maximum-minimum);
  158.         }
  159.     }
  160.     int minscale = handEdgesVerticalPixels[0][0]+handEdgesHorizontalPixels[0][0],
  161.         maxscale = handEdgesVerticalPixels[0][0]+handEdgesHorizontalPixels[0][0];
  162.     for(int i=0; i < handEdgesVerticalPixels.rows; i++)
  163.     {
  164.         for(int j = 0; j < handEdgesVerticalPixels.cols; j++)
  165.         {
  166.             if(handEdgesVerticalPixels[i][j] + handEdgesHorizontalPixels[i][j] > maxscale)
  167.                 maxscale = handEdgesVerticalPixels[i][j] + handEdgesHorizontalPixels[i][j];
  168.             if(handEdgesVerticalPixels[i][j] + handEdgesHorizontalPixels[i][j] < minscale)
  169.                 minscale = handEdgesVerticalPixels[i][j] + handEdgesHorizontalPixels[i][j];
  170.         }
  171.     }
  172.     Mat_<int> mat = handEdgesVertical;
  173.     for(int y=0;y< handEdgesVerticalPixels.rows; y++)
  174.     {
  175.         for(int x = 0; x < handEdgesVerticalPixels.cols; x++)
  176.         {
  177.             mat[y][x]=((handEdgesHorizontalPixels[y][x]+handEdgesVerticalPixels[y][x]-minscale)*255)/(maxscale-minscale);
  178.         }
  179.     }
  180.     handEdgesMergedPixels = handEdgesHorizontalPixels;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement