Georgiy031

Untitled

May 6th, 2021
564
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, GausImg, lineImg;
  62.  
  63.         cvtColor(src, grayImg, COLOR_BGR2GRAY);
  64.         GaussianBlur(grayImg, GausImg, {3, 3}, 0);
  65.         dilate(GausImg, 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(dilImg, binImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 51, 5);
  71.         //adaptiveThreshold(filtImg, binImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 21, 3);
  72.         medianBlur(binImg, blurImg, 3);
  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", blurImg);
  78.  
  79.         //Mat revImg;
  80.         //bitwise_not(blurImg, revImg);
  81.         Canny(blurImg, cannyImg, 0, 300);
  82.         imwrite("3conturs" + to_string(i) + ".jpg", cannyImg);
  83.  
  84.         vector<Vec4i> lines;
  85.         HoughLinesP(cannyImg, lines, 1, CV_PI / 180, 1, 1, 20);
  86.         cannyImg.copyTo(lineImg);
  87.         for (auto& l : lines) {
  88.             Point pt1(l[0], l[1]);
  89.             Point pt2(l[2], l[3]);
  90.             //Point del = 0.3 * (pt2 - pt1);
  91.             Point del = 0;
  92.             line(lineImg, pt1 - del , pt2 + del, cv::Scalar(255, 0, 0), 3, 8);
  93.         }
  94.         //bitwise_not(lineImg, lineImg);
  95.         //FillHoles(lineImg, lineImg, 7);
  96.         //medianBlur(lineImg, lineImg, 5);
  97.         medianBlur(lineImg, lineImg, 9);
  98.         //medianBlur(lineImg, lineImg, 21);
  99.         bitwise_not(lineImg, lineImg);
  100.  
  101.         imwrite("2line" + to_string(i) + ".jpg", lineImg);
  102.  
  103.         vector<vector<Point>> contours;
  104.         vector<Vec4i> hierarchy;
  105.        
  106.         findContours(lineImg, contours, hierarchy, RETR_LIST, CHAIN_APPROX_SIMPLE);
  107.         //findContours(lineImg, contours, hierarchy, RETR_LIST, CHAIN_APPROX_TC89_L1);
  108.         sort(contours.begin(), contours.end(), [](vector<Point>& lhs, vector<Point>& rhs) {
  109.             //return fabs(arcLength(Mat(lhs), true)) < fabs(arcLength(Mat(rhs), true));
  110.             return fabs(contourArea(Mat(lhs))) < fabs(contourArea(Mat(rhs)));
  111.         });
  112.         //Mat trash;
  113.         //src.copyTo(trash);
  114.         //drawContours(trash, contours, -1, Scalar(255, 0, 0), 2, LINE_AA, hierarchy, 1);
  115.         //imwrite("4trash" + to_string(i) + ".jpg", trash);
  116.         vector<Point> mainContour = contours.back();
  117.         double perimetr = arcLength(mainContour, true);
  118.         Mat result1, result2;
  119.         approxPolyDP(mainContour, result1, 0.02 * perimetr, true);
  120.         approxPolyDP(mainContour, result2, 1e-9, true);
  121.         //drawContours(src, { result2 }, -1, Scalar(0, 165, 255), 10, LINE_8);
  122.         //drawContours(src, { mainContour }, -1, Scalar(0, 165, 255), 1, LINE_8);
  123.         //VizContours(src, result2, Scalar(0, 165, 255));
  124.         VizContours(src, result1, Scalar(255, 165, 0));
  125.         imwrite("2result" + to_string(i) + ".jpg", src);
  126.  
  127.     }
  128.     waitKey(0);
  129. }
  130.  
  131. /*
  132. *
  133. ### Задание
  134. 1. Реализовать выделение "границ и уголков" на фотографиях документа.
  135. 2. Реализовать детектирование наиболее правдоподобного четырехугольника изображения страницы документа на фото.
  136. 3. Используя эталонную геометрическую разметку из лабораторной 5 реализовать численную оценку качества выделения отдельных примитивов и финального результата для отдельных изображений и для набора.
  137. 4. Реализовать представление результатов выполнения лабораторной (иллюстрации, таблицы, графики и т.д.) и вставить в отчет.
  138. */
RAW Paste Data