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;
- void detectEdges(Mat_<uchar> &peppersPixels, Mat_<uchar> &handEdgesMergedPixels, int centerX, int centerY);
- int _tmain(int argc, _TCHAR* argv[])
- {
- // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
- cvNamedWindow("Wykrywanie krawędzi", CV_WINDOW_AUTOSIZE);
- // Pobranie obrazu
- Mat imagePeppers = imread("hand.jpg",CV_LOAD_IMAGE_GRAYSCALE);
- // Utworzenie obiektu przechowującego obraz z wyznaczonymi krawędziami
- Mat handEdgesMerged = imagePeppers.clone();
- // Uzyskanie macierzy pikseli na podstawie obiektów Mat
- Mat_<uchar> handPixels = imagePeppers;
- Mat_<uchar> handEdgesMergedPixels = handEdgesMerged;
- // Wyznaczenie wpółrzędnych środa obrazu
- int centerX = handPixels.cols/2;
- int centerY = handPixels.rows/2;
- // Obracanie obrazu
- detectEdges(handPixels, handEdgesMergedPixels, centerX, centerY);
- // Wyświetlanie obrazu
- imshow("Wykrywanie krawędzi", handEdgesMerged);
- // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
- char key;
- do key = cvWaitKey(1);
- while(key != 27 && key != 13);
- // Niszczenie okna
- cvDestroyWindow("Wykrywanie krawędzi");
- return 0;
- }
- void detectEdges(Mat_<uchar> &handPixels, Mat_<uchar> &handEdgesMergedPixels, int centerX, int centerY)
- {
- /* Funkcja wyznaczająca krawędzie za pomocą maski morfologicznej podanej przez prowadzącego.
- Wyznaczane są najpierw krawędzie pionowe, później poziome. Następnie wykonywane jest scalenie
- krawędzi pionowych i poziomych, przeskalowanie obrazu scalonego do zakresu 0-255 oraz binaryzacja
- z eksperymentalnie dobranym progiem.
- Wynikowy obraz zostaje zapisany w handEdgesMergedPixels.*/
- // Utworzenie obiektów przechowujących obrazy z wyznaczonymi krawędziami: pionowymi i poziomymi
- Mat handEdgesVertical = handPixels.clone();
- Mat handEdgesHorizontal = handPixels.clone();
- // Uzyskanie macierzy pikseli na podstawie obiektów Mat
- Mat_<int> handEdgesVerticalPixels = handEdgesVertical;
- Mat_<int> handEdgesHorizontalPixels = handEdgesHorizontal;
- // TODO
- //poziome
- int piX, maxX=0, minX=0;
- for(int i=1; i<handPixels.rows-1;i++)
- {
- for(int j=1; j<handPixels.cols-1;j++)
- {
- piX=abs((handPixels[i-1][j-1]*1)+(handPixels[i-1][j]*1)+(handPixels[i-1][j+1]*1)+
- (handPixels[i][j-1]*0)+(handPixels[i][j]*0)+(handPixels[i][j+1]*0)+
- (handPixels[i+1][j-1]*(-1))+(handPixels[i+1][j]*(-1))+(handPixels[i+1][j+1]*(-1)));
- handEdgesHorizontalPixels[i][j]=piX;
- if(piX>maxX) maxX=piX;
- if(piX<minX) minX=piX;
- }
- }
- //pionowe
- int piY;
- for(int i=1; i<handPixels.rows-1;i++)
- {
- for(int j=1; j<handPixels.cols-1;j++)
- {
- piY=abs((handPixels[i-1][j-1]*(-1))+(handPixels[i-1][j]*0)+(handPixels[i-1][j+1]*1)+
- (handPixels[i][j-1]*(-1))+(handPixels[i][j]*0)+(handPixels[i][j+1]*1)+
- (handPixels[i+1][j-1]*(-1))+(handPixels[i+1][j]*0)+(handPixels[i+1][j+1]*1));
- handEdgesVerticalPixels[i][j]=piY;
- if(piY>maxX) maxX=piY;
- if(piY<minX) minX=piY;
- }
- }
- /*for (int i=0; i<handEdgesHorizontalPixels.rows;i++)
- {
- for (int j=0; j<handEdgesHorizontalPixels.cols;j++)
- {
- handEdgesHorizontalPixels[i][j]=(handEdgesHorizontalPixels[i][j]-minX)*(255-0)/(maxX-minX);
- }
- }*/
- for(int i=0; i<handPixels.rows;i++)
- {
- for(int j=0; j<handPixels.cols;j++)
- {
- handEdgesMergedPixels[i][j]=handEdgesHorizontalPixels[i][j]+handEdgesVerticalPixels[i][j];
- }
- }
- for(int i=0; i<handPixels.rows;i++)
- {
- for(int j=0; j<handPixels.cols;j++)
- {
- handEdgesMergedPixels[i][j]=(handEdgesMergedPixels[i][j]-minX)*(255-0)/(maxX-minX);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement