Advertisement
Guest User

Untitled

a guest
Nov 26th, 2013
463
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.57 KB | None | 0 0
  1. #pragma once
  2. #include "opencv2\core\core.hpp"
  3. #include "opencv\cv.h"
  4. #include "opencv2\highgui\highgui.hpp"
  5. #include <iostream>
  6. #include <fstream>
  7. #define _USE_MATH_DEFINES
  8. #include "math.h"
  9. using namespace std;
  10. using namespace cv;
  11. class WallFinder
  12. {
  13. private:
  14.     ofstream myfile;
  15.     vector<Vec4i> lines;
  16.     double deltaRho;
  17.     double deltaTheta;
  18.     int minVote;
  19.     double minLength;
  20.     double maxGap;
  21. public:
  22.     WallFinder() : deltaRho(1), deltaTheta(M_PI/180), minVote(10), minLength(0.), maxGap(0.) {}
  23.     void setMinVote(int minv) {
  24.         minVote= minv;
  25.     }
  26.     void setLineLengthAndGap(double length,double gap) {
  27.         minLength= length;
  28.         maxGap= gap;
  29.     }
  30.     void findLines(Mat& skeleton)
  31.     {
  32.         lines.clear();
  33.         HoughLinesP(skeleton,lines,deltaRho,deltaTheta,minVote,minLength,maxGap);
  34.     }
  35.     void showLinesOnImage(Mat& skeleton, Scalar color=Scalar(128))
  36.     {
  37.         int yaxis=0,xaxis=0,xaxis2=0,yaxis2=0;
  38.         myfile.open("coordinates.txt", ios::out);
  39.         for (vector<Vec4i>::const_iterator it=lines.begin(); it!=lines.end(); it++)
  40.         {
  41.             Point pt1((*it)[0],(*it)[1]);
  42.             Point pt2((*it)[2],(*it)[3]);
  43.             line( skeleton, pt1, pt2, color);
  44.             writeToFile((*it)[0],(*it)[1],(*it)[2],(*it)[3]);
  45.         }
  46.  
  47.         for (vector<Vec4i>::const_iterator it2=lines.begin(); it2!=lines.end(); it2++)
  48.         {
  49.             if((*it2)[0]==(*it2)[2])
  50.             {
  51.                 yaxis=(*it2)[1];
  52.                 while(yaxis!=(*it2)[3]-1)
  53.                 {
  54.                     xaxis=(*it2)[0];
  55.                     xaxis2=(*it2)[0];
  56.                     while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis-1))==255)
  57.                     {
  58.                         --xaxis;
  59.                     }
  60.                     while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2+1))==255)
  61.                     {
  62.                         ++xaxis2;
  63.                     }
  64.  
  65.                     if(xaxis!=(*it2)[0] && abs(xaxis-(*it2)[0])>5)
  66.                     {
  67.                         line(skeleton,Point(xaxis,yaxis),Point((*it2)[0],yaxis),color);
  68.                         writeToFile(xaxis,yaxis,(*it2)[0],yaxis);
  69.                         controlSecondaryLines(skeleton,xaxis,yaxis,(*it2)[0],yaxis);
  70.  
  71.                     }
  72.  
  73.                     if(xaxis2!=(*it2)[0] && abs(xaxis2-(*it2)[0])>5)
  74.                     {
  75.                         line(skeleton,Point((*it2)[0],yaxis),Point(xaxis2,yaxis),color);
  76.                         writeToFile((*it2)[0],yaxis,xaxis2,yaxis);
  77.                         controlSecondaryLines(skeleton,(*it2)[0],yaxis,xaxis2,yaxis);
  78.  
  79.                     }
  80.                     --yaxis;
  81.                 }
  82.             }
  83.             if((*it2)[1]==(*it2)[3])
  84.             {
  85.                 xaxis=(*it2)[2];
  86.                 while(xaxis!=(*it2)[0]-1)
  87.                 {
  88.                     yaxis=(*it2)[1];
  89.                     yaxis2=(*it2)[1];
  90.                     while (static_cast<int>(skeleton.at<uchar>(yaxis-1,xaxis))==255)
  91.                     {
  92.                         --yaxis;
  93.                     }
  94.                     while (static_cast<int>(skeleton.at<uchar>(yaxis2+1,xaxis))==255)
  95.                     {
  96.                         ++yaxis2;
  97.                     }
  98.  
  99.                     if(yaxis!=(*it2)[1] && abs(yaxis-(*it2)[1])>5)
  100.                     {
  101.                         line(skeleton,Point(xaxis,(*it2)[1]),Point(xaxis,yaxis),color);
  102.                         writeToFile(xaxis,(*it2)[1],xaxis,yaxis);
  103.                         controlSecondaryLines(skeleton,xaxis,(*it2)[1],xaxis,yaxis);
  104.  
  105.                     }
  106.  
  107.                     if(yaxis2!=(*it2)[1] && abs(yaxis2-(*it2)[1])>5)
  108.                     {
  109.                         line(skeleton,Point(xaxis,yaxis2),Point(xaxis,(*it2)[1]),color);
  110.                         writeToFile(xaxis,yaxis2,xaxis,(*it2)[1]);
  111.                         controlSecondaryLines(skeleton,xaxis,yaxis2,xaxis,(*it2)[1]);
  112.  
  113.                     }
  114.                     --xaxis;
  115.                 }
  116.             }
  117.         }
  118.         myfile.close();
  119.         controlThirtiaryLines(skeleton);
  120.     }
  121.     void writeToFile(int x1,int y1,int x2,int y2)
  122.     {
  123.         if(x1==x2)
  124.             myfile << 1 << " "<< x1 << " " << y2 << " "<< x2 << " " << y1 <<endl;
  125.         else
  126.             myfile << 1 << " "<< x1 << " " << y1 << " "<< x2 << " " << y2<<endl;
  127.     }
  128.  
  129.     Mat skeleton(Mat& img)
  130.     {
  131.         threshold(img, img, 50, 255, THRESH_BINARY);
  132.         Mat skel(img.size(), CV_8UC1, Scalar(0));
  133.         Mat temp;
  134.         Mat eroded;
  135.         Mat element = getStructuringElement(MORPH_CROSS, Size(3, 3));
  136.         bool done;     
  137.         do
  138.         {
  139.             erode(img, eroded, element);
  140.             dilate(eroded, temp, element);
  141.             subtract(img, temp, temp);
  142.             bitwise_or(skel, temp, skel);
  143.             eroded.copyTo(img);
  144.  
  145.             done = (countNonZero(img) == 0);
  146.         } while (!done);
  147.         dilate(skel,skel,Mat(),Point(-1,-1),2);
  148.         erode(skel,skel,Mat(),Point(-1,-1),2);
  149.         return skel;
  150.     }
  151.     void controlSecondaryLines(Mat& skeleton, int x1, int y1, int x2, int y2, Scalar color=Scalar(128))
  152.     {
  153.         int xaxis,xaxis2,yaxis,yaxis2;
  154.         if(x1==x2)
  155.         {
  156.             yaxis=y1;
  157.             while(yaxis!=y2-1)
  158.             {
  159.                 xaxis=x1;
  160.                 xaxis2=x1;
  161.                 while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis-1))==255)
  162.                 {
  163.                     --xaxis;
  164.                 }
  165.                 while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2+1))==255)
  166.                 {
  167.                     ++xaxis2;
  168.                 }
  169.  
  170.                 if(xaxis!=x1 && abs(xaxis-x1)>5)
  171.                 {
  172.                     line(skeleton,Point(xaxis,yaxis),Point(x1,yaxis),color);
  173.                     writeToFile(xaxis,yaxis,x1,yaxis);
  174.                     controlSecondaryLines(skeleton,xaxis,yaxis,x1,yaxis);
  175.  
  176.                 }
  177.  
  178.                 if(xaxis2!=x1 && abs(xaxis2-x1)>5)
  179.                 {
  180.                     line(skeleton,Point(x1,yaxis),Point(xaxis2,yaxis),color);
  181.                     writeToFile(x1,yaxis,xaxis2,yaxis);
  182.                     controlSecondaryLines(skeleton,x1,yaxis,xaxis2,yaxis);
  183.  
  184.                 }
  185.                 --yaxis;
  186.             }
  187.         }
  188.         if(y1==y2)
  189.         {
  190.             xaxis=x2;
  191.             while(xaxis!=x1-1)
  192.             {
  193.                 yaxis=y1;
  194.                 yaxis2=y1;
  195.                 while (static_cast<int>(skeleton.at<uchar>(yaxis-1,xaxis))==255)
  196.                 {
  197.                     --yaxis;
  198.                 }
  199.                 while (static_cast<int>(skeleton.at<uchar>(yaxis2+1,xaxis))==255)
  200.                 {
  201.                     ++yaxis2;
  202.                 }
  203.  
  204.                 if(yaxis!=y1 && abs(yaxis-y1)>5)
  205.                 {
  206.                     line(skeleton,Point(xaxis,y1),Point(xaxis,yaxis),color);
  207.                     writeToFile(xaxis,y1,xaxis,yaxis);
  208.                     controlSecondaryLines(skeleton,xaxis,y1,xaxis,yaxis);
  209.  
  210.                 }
  211.  
  212.                 if(yaxis2!=y1 && abs(yaxis2-y1)>5)
  213.                 {
  214.                     line(skeleton,Point(xaxis,yaxis2),Point(xaxis,y1),color);
  215.                     writeToFile(xaxis,yaxis2,xaxis,y1);
  216.                     controlSecondaryLines(skeleton,xaxis,yaxis2,xaxis,y1);
  217.  
  218.                 }
  219.                 --xaxis;
  220.             }
  221.         }
  222.     }
  223.  
  224.     void controlThirtiaryLines(Mat& skeleton)
  225.     {
  226.         int a=0,i=0,j=0,k=0,l=0;
  227.         char *inname = "coordinates.txt";
  228.         ifstream infile(inname);
  229.         while (infile>>a>>i>>j>>k>>l)
  230.         {
  231.             findThirtiaryLines(skeleton,i,j,k,l);
  232.         }
  233.         infile.close();
  234.     }
  235.  
  236.     void findThirtiaryLines(Mat& skeleton, int x1, int y1, int x2, int y2, Scalar color=Scalar(128))
  237.     {
  238.         int xaxis,xaxis2,yaxis,yaxis2=0,tempYaxis,tempYaxis2;
  239.         if(x1==x2)
  240.         {
  241.             yaxis=y2;
  242.             while(yaxis!=y1-1)
  243.             {
  244.                 xaxis=x1;
  245.                 xaxis2=x1;
  246.                 tempYaxis=yaxis;
  247.                 tempYaxis2=yaxis;
  248.                 // control right side
  249.                 while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis+1))!=255)
  250.                 {
  251.                     if(static_cast<int>(skeleton.at<uchar>(yaxis,xaxis+1))==128 || xaxis+1==skeleton.cols)
  252.                     {
  253.                         xaxis=x1;
  254.                         break;
  255.                     }
  256.                     else
  257.                     {
  258.                         ++xaxis;
  259.                     }
  260.                 }
  261.  
  262.                 if (xaxis!=x1)
  263.                 {
  264.                     int temp=xaxis;
  265.                     while (static_cast<int>(skeleton.at<uchar>(yaxis,temp+1))==255)
  266.                     {
  267.                         ++temp;
  268.                     }
  269.                     if(temp!=xaxis)
  270.                     {
  271.                         line(skeleton,Point(xaxis,yaxis), Point(temp,yaxis),color);
  272.                         controlSecondaryLines(skeleton,xaxis,yaxis,temp,yaxis);
  273.                     }
  274.                 }
  275.                 // control left side
  276.                 while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2-1))!=255)
  277.                 {
  278.                     if(static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2-1))==128 || xaxis2-1==0)
  279.                     {
  280.                         xaxis2=x1;
  281.                         break;
  282.                     }
  283.                     else
  284.                     {
  285.                         --xaxis2;
  286.                     }
  287.                 }
  288.  
  289.                 if (xaxis2!=x1)
  290.                 {
  291.                     int temp=xaxis2;
  292.                     while (static_cast<int>(skeleton.at<uchar>(yaxis,temp-1))==255)
  293.                     {
  294.                         --temp;
  295.                     }
  296.                     if(temp!=xaxis2)
  297.                     {
  298.                         line(skeleton, Point(temp,yaxis), Point(xaxis2,yaxis),color);
  299.                         controlSecondaryLines(skeleton,temp,yaxis,xaxis2,yaxis);
  300.                     }
  301.                 }
  302.                 // control up side
  303.                 while (static_cast<int>(skeleton.at<uchar>(tempYaxis-1,xaxis))!=255)
  304.                 {
  305.                     if(static_cast<int>(skeleton.at<uchar>(tempYaxis-1,xaxis))==128 || tempYaxis-1==0)
  306.                     {
  307.                         tempYaxis=yaxis;
  308.                         break;
  309.                     }
  310.                     else
  311.                     {
  312.                         --tempYaxis;
  313.                     }
  314.                 }
  315.                 if (tempYaxis!=yaxis)
  316.                 {
  317.                     int temp=tempYaxis;
  318.                     while (static_cast<int>(skeleton.at<uchar>(temp-1,xaxis))==255)
  319.                     {
  320.                         --temp;
  321.                     }
  322.                     if(temp!=tempYaxis)
  323.                     {
  324.                         line(skeleton,Point(xaxis,tempYaxis),Point(xaxis,temp),color);
  325.                         controlSecondaryLines(skeleton,xaxis,tempYaxis,xaxis,temp);
  326.                     }
  327.                 }
  328.                 // control down side
  329.                 while (static_cast<int>(skeleton.at<uchar>(tempYaxis2+1,xaxis))!=255)
  330.                 {
  331.                     if(static_cast<int>(skeleton.at<uchar>(tempYaxis2+1,xaxis))==128 || tempYaxis2+1==skeleton.rows)
  332.                     {
  333.                         tempYaxis2=yaxis;
  334.                         break;
  335.                     }
  336.                     else
  337.                     {
  338.                         ++tempYaxis2;
  339.                     }
  340.                 }
  341.                 if (tempYaxis2!=yaxis)
  342.                 {
  343.                     int temp=tempYaxis2;
  344.                     while (static_cast<int>(skeleton.at<uchar>(temp+1,xaxis))==255)
  345.                     {
  346.                         ++temp;
  347.                     }
  348.                     if(temp!=tempYaxis2)
  349.                     {
  350.                         line(skeleton,Point(xaxis,temp),Point(xaxis,tempYaxis2),color);
  351.                         controlSecondaryLines(skeleton,xaxis,temp,xaxis,tempYaxis2);
  352.                     }
  353.                 }
  354.                 --yaxis;
  355.             }
  356.         }
  357.     }
  358. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement