Advertisement
Guest User

Untitled

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