Georgiy031

Untitled

May 5th, 2021
573
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <string>
  5.  
  6. #include <opencv2/opencv.hpp>
  7.  
  8. using namespace cv;
  9. using namespace std;
  10.  
  11.  
  12. vector<string> files = { "P_20210309_064128_vHDR_Auto.jpg",
  13.                          "P_20210410_170757_vHDR_On.jpg" ,
  14.                          "P_20210410_170813_vHDR_On.jpg" ,
  15.                          "P_20210410_170832_vHDR_On.jpg" ,
  16.                          "P_20210410_170858_vHDR_On.jpg" ,
  17.                          "P_20210410_170941_vHDR_On.jpg" ,
  18.                          "P_20210410_171129_vHDR_On.jpg" ,
  19.                          "P_20210410_171136_vHDR_On.jpg" ,
  20.                          "P_20210410_171334_vHDR_On.jpg" ,
  21. };
  22.  
  23.  
  24. void VizContours(Mat& src, const vector<Point>& points, const Scalar& color) {
  25.     Point pt = points.back();
  26.     for (auto& cur : points) {
  27.         line(src, pt, cur, color, 5, LINE_AA);
  28.         pt = cur;
  29.     }
  30. }
  31.  
  32.  
  33. void FillHoles(const Mat& src, Mat& dst, int d) {
  34.     src.copyTo(dst);
  35.     for (int i = 0; i + d < src.rows; i += d) {
  36.         for (int j = 0; j + d < src.cols; j += d) {
  37.             int k = 0;
  38.             for (int l = 0; l < d; ++l) {
  39.                 for (int m = 0; m < d; ++m) {
  40.                     if (dst.at<uchar>(i + l, j + m) < 128) {
  41.                         ++k;
  42.                     }
  43.                 }
  44.             }
  45.             if (k > 0.1 * d * d) {
  46.                 for (int l = 0; l < d; ++l) {
  47.                     for (int m = 0; m < d; ++m) {
  48.                         dst.at<uchar>(i + l, j + m) = 0;
  49.                     }
  50.                 }
  51.             }
  52.         }
  53.     }
  54. }
  55.  
  56. int main() {
  57.     for (int i = 0; i < files.size(); ++i)
  58.     {
  59.         cout << "Image #" << i << endl;
  60.         Mat src = imread(files[i]);
  61.         Mat grayImg, blurImg, binImg, cannyImg, filtImg, dilImg;
  62.  
  63.         cvtColor(src, grayImg, COLOR_BGR2GRAY);
  64.         GaussianBlur(grayImg, grayImg, {3, 3}, 0);
  65.         dilate(grayImg, dilImg, getStructuringElement(cv::MORPH_RECT, cv::Point(9, 9)));
  66.         //bilateralFilter(grayImg, filtImg, 9, 75, 75);
  67.         //Mat temp1, temp2;
  68.         // adaptiveThreshold(filtImg, temp1, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);
  69.         //adaptiveThreshold(temp1, temp2, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 21, 5);
  70.         //adaptiveThreshold(filtImg, binImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 151, 5);
  71.         //adaptiveThreshold(filtImg, binImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 21, 3);
  72.         //medianBlur(binImg, blurImg, 21);
  73.         //FillHoles(blurImg, blurImg, 15);
  74.        
  75.         //copyMakeBorder(blurImg, blurImg, 10, 10, 10, 10, BORDER_CONSTANT, { 0, 0, 0 });
  76.         //copyMakeBorder(src, src, 10, 10, 10, 10, BORDER_DEFAULT, { 0, 0, 0 });
  77.         imwrite("1bin" + to_string(i) + ".jpg", dilImg);
  78.  
  79.         //Mat revImg;
  80.         //bitwise_not(blurImg, revImg);
  81.         Canny(blurImg, cannyImg, 200, 250);
  82.         imwrite("3conturs" + to_string(i) + ".jpg", cannyImg);
  83.  
  84.         vector<vector<Point>> contours;
  85.         vector<Vec4i> hierarchy;
  86.        
  87.         findContours(cannyImg, contours, hierarchy, RETR_LIST, CHAIN_APPROX_SIMPLE);
  88.         sort(contours.begin(), contours.end(), [](vector<Point>& lhs, vector<Point>& rhs) {
  89.             return fabs(arcLength(Mat(lhs), true)) < fabs(arcLength(Mat(rhs), true));
  90.         });
  91.         //Mat trash;
  92.         //src.copyTo(trash);
  93.         //drawContours(trash, contours, -1, Scalar(255, 0, 0), 2, LINE_AA, hierarchy, 1);
  94.         //imwrite("4trash" + to_string(i) + ".jpg", trash);
  95.         vector<Point> mainContour = contours.back();
  96.         double perimetr = arcLength(mainContour, true);
  97.         Mat result1, result2;
  98.         approxPolyDP(mainContour, result1, 0.03 * perimetr, true);
  99.         approxPolyDP(mainContour, result2, 1e-9, true);
  100.         //drawContours(src, { result2 }, -1, Scalar(0, 165, 255), 10, LINE_8);
  101.         //drawContours(src, { mainContour }, -1, Scalar(0, 165, 255), 1, LINE_8);
  102.         VizContours(src, result1, Scalar(255, 165, 0));
  103.         VizContours(src, result2, Scalar(0, 165, 255));
  104.         imwrite("2result" + to_string(i) + ".jpg", src);
  105.  
  106.     }
  107.     waitKey(0);
  108. }
  109.  
  110. /*
  111. *
  112. ### Задание
  113. 1. Реализовать выделение "границ и уголков" на фотографиях документа.
  114. 2. Реализовать детектирование наиболее правдоподобного четырехугольника изображения страницы документа на фото.
  115. 3. Используя эталонную геометрическую разметку из лабораторной 5 реализовать численную оценку качества выделения отдельных примитивов и финального результата для отдельных изображений и для набора.
  116. 4. Реализовать представление результатов выполнения лабораторной (иллюстрации, таблицы, графики и т.д.) и вставить в отчет.
  117. */
RAW Paste Data