Georgiy031

Untitled

May 6th, 2021
584
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 <fstream>
  5. #include <string>
  6.  
  7. #include <opencv2/opencv.hpp>
  8.  
  9. using namespace cv;
  10. using namespace std;
  11.  
  12.  
  13. double ssim(const Mat& img1, const Mat& img2)
  14. {
  15.     const double C1 = 255 * 0.01 * 255 * 0.01;
  16.     const double C2 = 255 * 0.03 * 255 * 0.03;
  17.  
  18.     Mat I1, I2;
  19.     img1.convertTo(I1, CV_32F);
  20.     img2.convertTo(I2, CV_32F);
  21.  
  22.     Mat I2_2 = I2.mul(I2);
  23.     Mat I1_2 = I1.mul(I1);
  24.     Mat I1_I2 = I1.mul(I2);
  25.  
  26.     Mat mu1, mu2;
  27.     GaussianBlur(I1, mu1, Size(11, 11), 1.5);
  28.     GaussianBlur(I2, mu2, Size(11, 11), 1.5);
  29.  
  30.     Mat mu1_2 = mu1.mul(mu1);
  31.     Mat mu2_2 = mu2.mul(mu2);
  32.     Mat mu1_mu2 = mu1.mul(mu2);
  33.  
  34.     Mat sigma1_2, sigma2_2, sigma12;
  35.  
  36.     GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
  37.     sigma1_2 -= mu1_2;
  38.  
  39.     GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
  40.     sigma2_2 -= mu2_2;
  41.  
  42.     GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
  43.     sigma12 -= mu1_mu2;
  44.  
  45.     Mat t1, t2, t3;
  46.  
  47.     t1 = 2 * mu1_mu2 + C1;
  48.     t2 = 2 * sigma12 + C2;
  49.     t3 = t1.mul(t2);
  50.  
  51.     t1 = mu1_2 + mu2_2 + C1;
  52.     t2 = sigma1_2 + sigma2_2 + C2;
  53.     t1 = t1.mul(t2);
  54.  
  55.     Mat ssim_map;
  56.     divide(t3, t1, ssim_map);
  57.  
  58.     return mean(ssim_map)[0];
  59. }
  60.  
  61.  
  62. void VizContours(Mat& src, const vector<Point>& points, const Scalar& color) {
  63.     Point pt = points.back();
  64.     for (auto& cur : points) {
  65.         line(src, pt, cur, color, 5, LINE_AA);
  66.         pt = cur;
  67.     }
  68. }
  69.  
  70.  
  71. void MakeMosaic(const vector<Mat>& src, Mat& dst) {
  72.     int kh = sqrt(src.size());
  73.     int kw = (src.size() + kh - 1) / kh;
  74.     int ind = 0;
  75.     Mat empty(src[0].size(), CV_8UC3);
  76.     dst = Mat();
  77.     for (int i = 0; i < kh && ind < src.size(); ++i) {
  78.         Mat row = src[ind++];
  79.         for (int j = 1; j < kw; ++j) {
  80.             hconcat(row, ind < src.size() ? src[ind++] : empty, row);
  81.         }
  82.         if (dst.size().area() == 0) {
  83.             dst = row;
  84.         }
  85.         else {
  86.             vconcat(dst, row, dst);
  87.         }
  88.     }
  89. }
  90.  
  91.  
  92. void GroupAndWrite(const vector<Mat>& vec, const string fileName) {
  93.     Mat result;
  94.     MakeMosaic(vec, result);
  95.     imwrite(fileName, result);
  96. }
  97.  
  98.  
  99. int main() {
  100.     ifstream in("fileNames.txt");
  101.     string file;
  102.    
  103.     vector<Mat> srcVec, grayVec, gausVec, dilVec, binVec, blurVec, cannyVec, lineVec, resVec;
  104.  
  105.     while (getline(in, file))
  106.     {
  107.         Mat src = imread(file);
  108.         srcVec.push_back(src);
  109.         Mat grayImg, gausImg, dilImg, binImg, blurImg, cannyImg, lineImg, resImg;
  110.  
  111.         cvtColor(src, grayImg, COLOR_BGR2GRAY);
  112.         GaussianBlur(grayImg, gausImg, { 3, 3 }, 0);
  113.         dilate(gausImg, dilImg, getStructuringElement(cv::MORPH_RECT, cv::Point(9, 9)));
  114.         adaptiveThreshold(dilImg, binImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 51, 5);
  115.         medianBlur(binImg, blurImg, 3);
  116.  
  117.         Canny(blurImg, cannyImg, 0, 300);
  118.  
  119.         vector<Vec4i> lines;
  120.         HoughLinesP(cannyImg, lines, 1, CV_PI / 180, 1, 1, 20);
  121.         cannyImg.copyTo(lineImg);
  122.         for (auto& l : lines) {
  123.             line(lineImg, Point(l[0], l[1]), Point(l[2], l[3]), cv::Scalar(255, 0, 0), 3, 8);
  124.         }
  125.         medianBlur(lineImg, lineImg, 9);
  126.         bitwise_not(lineImg, lineImg); // ?
  127.  
  128.         vector<vector<Point>> contours;
  129.         vector<Vec4i> hierarchy;
  130.  
  131.         findContours(lineImg, contours, hierarchy, RETR_LIST, CHAIN_APPROX_SIMPLE);
  132.         sort(contours.begin(), contours.end(), [](vector<Point>& lhs, vector<Point>& rhs) {
  133.             return fabs(contourArea(Mat(lhs))) < fabs(contourArea(Mat(rhs)));
  134.         });
  135.         vector<Point> mainContour = contours.back();
  136.         double perimetr = arcLength(mainContour, true);
  137.         approxPolyDP(mainContour, resImg, 0.02 * perimetr, true);
  138.         VizContours(src, resImg, Scalar(255, 165, 0));
  139.  
  140.         grayVec.push_back(grayImg);
  141.         gausVec.push_back(gausImg);
  142.         dilVec.push_back(dilImg);  
  143.         binVec.push_back(binImg);
  144.         blurVec.push_back(blurImg);
  145.         cannyVec.push_back(cannyImg);
  146.         lineVec.push_back(lineImg);
  147.         resVec.push_back(resImg);
  148.     }
  149.     GroupAndWrite(srcVec, "srcVec.jpg");
  150.     GroupAndWrite(grayVec, "grayVec.jpg");
  151.     GroupAndWrite(gausVec, "gausVec.jpg");
  152.     GroupAndWrite(dilVec, "dilVec.jpg");
  153.     GroupAndWrite(binVec, "binVec.jpg");
  154.     GroupAndWrite(blurVec, "blurVec.jpg");
  155.     GroupAndWrite(cannyVec, "cannyVec.jpg");
  156.     GroupAndWrite(lineVec, "lineVec.jpg");
  157.     GroupAndWrite(resVec, "resVec.jpg");
  158.  
  159.     waitKey(0);
  160. }
  161.  
  162. /*
  163. *
  164. ### Задание
  165. 1. Реализовать выделение "границ и уголков" на фотографиях документа.
  166. 2. Реализовать детектирование наиболее правдоподобного четырехугольника изображения страницы документа на фото.
  167. 3. Используя эталонную геометрическую разметку из лабораторной 5 реализовать численную оценку качества выделения отдельных примитивов и финального результата для отдельных изображений и для набора.
  168. 4. Реализовать представление результатов выполнения лабораторной (иллюстрации, таблицы, графики и т.д.) и вставить в отчет.
  169. */
RAW Paste Data