Advertisement
osipyonok

MPI_Sobel_1

Apr 20th, 2017
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. // ParalellProg_lab1.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <iostream>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <opencv2/core/core.hpp>
  10. #include <opencv2/highgui/highgui.hpp>
  11. #include <opencv2/opencv.hpp>
  12. #include <opencv2/imgproc/imgproc.hpp>
  13. #include <opencv2/objdetect/objdetect.hpp>
  14. #include <mpi.h>
  15.  
  16. using namespace std;
  17. using namespace cv;
  18.  
  19. #define ll long long
  20.  
  21. const int radius = 1;
  22. const vector<vector<int>> sobel_x = { {-1 , 0 , 1} , {-2 , 0 , 2} , {-1 , 0 , 1} };
  23. const vector<vector<int>> sobel_y = { {-1 , -2 , -1} , {0 , 0 , 0} , {1 , 2 , 1} };
  24.  
  25. int worldSize;
  26. int worldRank;
  27. char processorName[MPI_MAX_PROCESSOR_NAME];
  28. int nameLength;
  29. static volatile double ans = 0;
  30.  
  31. static vector<string> q;
  32.  
  33.  
  34. int ** alloc_2d_int(int rows, int cols) {
  35.     int * data = (int *)malloc(rows * cols * sizeof(int));
  36.     int ** arr = (int **)malloc(rows * sizeof(int *));
  37.     for (int i = 0; i < rows; ++i)
  38.         arr[i] = &(data[cols * i]);
  39.     return arr;
  40. }
  41.  
  42. int main(int argc, char* argv[]) {
  43.     int flag;
  44.     MPI_Initialized(&flag);
  45.     if (!flag)
  46.         MPI_Init(&argc, &argv);
  47.        
  48.     MPI_Comm_size(MPI_COMM_WORLD, &worldSize);
  49.     MPI_Comm_rank(MPI_COMM_WORLD, &worldRank);
  50.     MPI_Status status;
  51.  
  52.     int ** gradX;
  53.     int ** gradY;
  54.  
  55.     int fcnt;
  56.  
  57.     if (worldRank == 0) {
  58.         freopen("files.txt", "r", stdin);
  59.         string str;
  60.         while (getline(cin, str))q.push_back(str);
  61.         fcnt = q.size();
  62.  
  63.         for (int i = 1; i < worldSize; ++i)
  64.             MPI_Send(&fcnt, 1, MPI_INT, i, 99, MPI_COMM_WORLD);
  65.     }
  66.     else {
  67.         MPI_Recv(&fcnt, 1, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
  68.     }
  69.  
  70.     Mat img;
  71.     Mat img_gray, image_blur;
  72.  
  73.     ll before = clock();
  74.  
  75.     for (int img1 = 0; img1 < fcnt ; ++img1) {
  76.         int n, m, start, rpp , first_row;
  77.         int ** A;
  78.         int last_row = 1;
  79.         int fi, la;
  80.  
  81.         if (worldRank == 0) {//Big boss
  82.             String path = q[img1];
  83.             img = imread(path);
  84.  
  85.             GaussianBlur(img, image_blur, Size(5, 5), 3, 3);
  86.             cvtColor(image_blur, img_gray, CV_RGB2GRAY);
  87.  
  88.  
  89.             int cols = img_gray.cols;
  90.             int rows = img_gray.rows;
  91.  
  92.             int rows_per_proc = rows / worldSize;
  93.  
  94.             Mat _src;
  95.             copyMakeBorder(img_gray, _src, radius, radius, radius, radius, BORDER_REFLECT101);
  96.  
  97.             n = rows;
  98.             m = cols;
  99.            
  100.             fi = 1;
  101.             la = fi + rows_per_proc - 1;
  102.            
  103.             for (int i = 1; i < worldSize; ++i){
  104.                 MPI_Send(&fi, 1, MPI_INT, i, 100, MPI_COMM_WORLD);
  105.                 int ** tmp;
  106.                 tmp = alloc_2d_int(rows_per_proc + 2, cols);
  107.  
  108.                 MPI_Send(&la, 1, MPI_INT, i, 101, MPI_COMM_WORLD);
  109.                 MPI_Send(&m, 1, MPI_INT, i, 102, MPI_COMM_WORLD);
  110.                 for (int x = fi - 1; x <= la + 1; ++x) {
  111.                     for (int y = 0; y < cols; ++y) {
  112.                         tmp[x - fi + 1][y] = _src.at<uchar>(x, y);
  113.                     }
  114.                 }  
  115.  
  116.                 fi = la + 1;
  117.                 la = fi + rows_per_proc - 1;
  118.                 MPI_Send(&(tmp[0][0]), (rows_per_proc + 2) * cols, MPI_INT, i, 103, MPI_COMM_WORLD);
  119.             }
  120.  
  121.             la = n - 1;
  122.  
  123.             A = alloc_2d_int((la - fi + 3), m);
  124.             for (int x = fi - 1; x <= la; ++x) {
  125.                 for (int y = 0; y < cols; ++y) {
  126.                     A[x - fi + 1][y] = _src.at<uchar>(x, y);
  127.                 }
  128.             }
  129.         }
  130.         else {
  131.             MPI_Recv(&fi, 1, MPI_INT, 0, 100, MPI_COMM_WORLD, &status);
  132.             MPI_Recv(&la, 1, MPI_INT, 0, 101, MPI_COMM_WORLD, &status);
  133.             MPI_Recv(&m, 1, MPI_INT, 0, 102, MPI_COMM_WORLD, &status);
  134.             A = alloc_2d_int((la - fi + 3), m);
  135.             MPI_Recv(&(A[0][0]), (la - fi + 3) * m, MPI_INT, 0, 103, MPI_COMM_WORLD, &status);
  136.         }
  137.  
  138.         gradX = alloc_2d_int((la - fi + 3), m);
  139.         gradY = alloc_2d_int((la - fi + 3), m);
  140.  
  141.         for (int r = radius; r < (la - fi + 3) - radius; ++r) {
  142.             for (int c = radius ; c < m - radius; ++c) {
  143.                 int sx = 0, sy = 0;
  144.                 for (int i = -radius; i <= radius; ++i) {
  145.                     for (int j = -radius; j <= radius; ++j) {
  146.                         sx += A[r + i][c + j] * sobel_x[i + radius][j + radius];
  147.                         sy += A[r + i][c + j] * sobel_y[i + radius][j + radius];
  148.                     }
  149.                 }
  150.                 sx /= 30;
  151.                 sy /= 30;
  152.  
  153.                 gradX[r - radius][c - radius] = sx;
  154.                 gradY[r - radius][c - radius] = sy;
  155.             }
  156.         }
  157.  
  158.         free(A[0]); free(A);
  159.        
  160.         if (worldRank == 0) {
  161.             int ** finalGradX;
  162.             int ** finalGradY;
  163.             int ** tmpX;
  164.             int ** tmpY;
  165.  
  166.             finalGradX = alloc_2d_int(n + 10, m + 10);
  167.             finalGradY = alloc_2d_int(n + 10, m + 10);
  168.  
  169.             for (int i = 1; i < worldSize; ++i) {
  170.                 int cfi, cla;
  171.                 MPI_Recv(&cfi, 1, MPI_INT, i, 105, MPI_COMM_WORLD, &status);
  172.                 MPI_Recv(&cla, 1, MPI_INT, i, 106, MPI_COMM_WORLD, &status);
  173.                 tmpX = alloc_2d_int((cla - cfi + 3), m);
  174.                 tmpY = alloc_2d_int((cla - cfi + 3), m);
  175.                 MPI_Recv(&(tmpX[0][0]), (cla - cfi + 3) * m, MPI_INT, i, 107, MPI_COMM_WORLD, &status);
  176.                 MPI_Recv(&(tmpY[0][0]), (cla - cfi + 3) * m, MPI_INT, i, 108, MPI_COMM_WORLD, &status);
  177.  
  178.                 for (int x = cfi; x <= cla; ++x) {
  179.                     for (int y = 0; y < m; ++y) {
  180.                         finalGradX[x][y] = tmpX[x - cfi][y];
  181.                         finalGradY[x][y] = tmpY[x - cfi][y];
  182.                     }
  183.                 }
  184.  
  185.                 free(tmpX[0]); free(tmpY[0]);
  186.                 free(tmpX); free(tmpY);
  187.             }
  188.             for (int x = 0; x < m; ++x)gradX[0][x] = gradY[0][x] = 0;
  189.  
  190.             for (int x = fi; x <= la; ++x) {
  191.                 for (int y = 0; y < m; ++y) {
  192.                     finalGradX[x][y] = gradX[x - fi][y];
  193.                     finalGradY[x][y] = gradY[x - fi][y];
  194.                 }
  195.             }
  196.  
  197.             free(gradX[0]); free(gradY[0]);
  198.             free(gradX); free(gradY);
  199.  
  200.             Mat gradient_x = img_gray.clone();
  201.             Mat gradient_y = img_gray.clone();
  202.             Mat gradient_f = img_gray.clone();
  203.  
  204.             for (int i = 0; i < gradient_x.rows; ++i)
  205.                 for (int j = 0; j < gradient_x.cols; ++j) {
  206.                     gradient_x.at<uchar>(i, j) = finalGradX[i][j];
  207.                     gradient_y.at<uchar>(i, j) = finalGradY[i][j];
  208.                 }
  209.  
  210.             free(finalGradX[0]); free(finalGradY[0]);
  211.             free(finalGradX); free(finalGradY);
  212.  
  213.             Mat absGrad_x, absGrad_y;
  214.             convertScaleAbs(gradient_x, absGrad_x);
  215.             convertScaleAbs(gradient_y, absGrad_y);
  216.  
  217.             for (int i = 0; i < gradient_f.rows; i++) {
  218.                 for (int j = 0; j < gradient_f.cols; j++) {
  219.                     gradient_f.at<uchar>(i, j) = sqrt(pow(gradient_x.at<uchar>(i, j), 2) + pow(gradient_y.at<uchar>(i, j), 2));
  220.                     gradient_f.at<uchar>(i, j) = gradient_f.at<uchar>(i, j) >= 240 ? 100 : 0;
  221.                 }
  222.             }
  223.  
  224.             imwrite(q[img1] + "output.jpg", gradient_f);
  225.  
  226.         }
  227.         else {
  228.             MPI_Send(&fi, 1, MPI_INT, 0, 105, MPI_COMM_WORLD);
  229.             MPI_Send(&la, 1, MPI_INT, 0, 106, MPI_COMM_WORLD);
  230.             MPI_Send(&(gradX[0][0]), (la - fi + 3) * m, MPI_INT, 0, 107, MPI_COMM_WORLD);
  231.             MPI_Send(&(gradY[0][0]), (la - fi + 3) * m, MPI_INT, 0, 108, MPI_COMM_WORLD);
  232.             free(gradX[0]); free(gradY[0]);
  233.             free(gradX); free(gradY);
  234.         }
  235.     }
  236.  
  237.     if (worldRank == 0) {
  238.         ll after = clock();
  239.  
  240.         cout << "Total time: " << (double)(after - before) / CLOCKS_PER_SEC << " sec" << endl;
  241.         cout << "Average time: " << (double)((after - before) / CLOCKS_PER_SEC) / q.size() << " sec" << endl;
  242.     }
  243.  
  244.     MPI_Finalize();
  245.     return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement