Guest User

Untitled

a guest
Oct 22nd, 2013
164
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.     vector<Vec4i> secondaryLines;
  17.     double deltaRho;
  18.     double deltaTheta;
  19.     int minVote;
  20.     double minLength;
  21.     double maxGap;
  22. public:
  23.     WallFinder() : deltaRho(1), deltaTheta(M_PI/180), minVote(10), minLength(0.), maxGap(0.) {}
  24.     void setMinVote(int minv) {
  25.     minVote= minv;
  26.     }
  27.     void setLineLengthAndGap(double length,double gap) {
  28.     minLength= length;
  29.     maxGap= gap;
  30.     }
  31.     void findLines(Mat& skeleton)
  32.     {
  33.     lines.clear();
  34.     HoughLinesP(skeleton,lines,deltaRho,deltaTheta,minVote,minLength,maxGap);
  35.     }
  36.     void showLinesOnImage(Mat& skeleton, Scalar color=Scalar(128))
  37.     {
  38.     int i=0,j=0,yaxis=0,xaxis=0,xaxis2=0,yaxis2=0;
  39.     myfile.open("coordinates.txt", ios::out);
  40.     for (vector<Vec4i>::const_iterator it=lines.begin(); it!=lines.end(); it++)
  41.     {
  42.     Point pt1((*it)[0],(*it)[1]);
  43.     Point pt2((*it)[2],(*it)[3]);
  44.     line( skeleton, pt1, pt2, color);
  45.     writeToFile((*it)[0],(*it)[1],(*it)[2],(*it)[3],i);
  46.     ++i;
  47.     }
  48.     for (vector<Vec4i>::const_iterator it2=lines.begin(); it2!=lines.end(); it2++)
  49.     {
  50.         if((*it2)[0]==(*it2)[2])
  51.         {
  52.             yaxis=(*it2)[1];
  53.             while(yaxis!=(*it2)[3]-1)
  54.             {
  55.             xaxis=(*it2)[0];
  56.             xaxis2=(*it2)[0];
  57.             while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis-5))==255)
  58.             {
  59.                 --xaxis;
  60.             }
  61.             while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2+5))==255)
  62.             {
  63.                 ++xaxis2;
  64.             }
  65.        
  66.             if(xaxis!=(*it2)[0])
  67.             {
  68.                 line(skeleton,Point((*it2)[0],yaxis),Point(xaxis,yaxis),color);
  69.                 writeToFile((*it2)[0],yaxis,xaxis,yaxis,i);
  70.                 lines.push_back(Vec4i((*it2)[0],yaxis,xaxis,yaxis)); //ERROR
  71.                 ++i;
  72.             }
  73.            
  74.             if(xaxis2!=(*it2)[0])
  75.             {
  76.                 line(skeleton,Point((*it2)[0],yaxis),Point(xaxis2,yaxis),color);
  77.                 writeToFile((*it2)[0],yaxis,xaxis2,yaxis,i);
  78.                 lines.push_back(Vec4i((*it2)[0],yaxis,xaxis2,yaxis)); //ERROR
  79.                 ++i;
  80.             }
  81.             --yaxis;
  82.             }
  83.         }
  84.         if((*it2)[1]==(*it2)[3])
  85.         {
  86.             xaxis=(*it2)[2];
  87.             while(xaxis!=(*it2)[0]-1)
  88.             {
  89.             yaxis=(*it2)[1];
  90.             yaxis2=(*it2)[1];
  91.             while (static_cast<int>(skeleton.at<uchar>(yaxis-7,xaxis))==255)
  92.             {
  93.                 --yaxis;
  94.             }
  95.             while (static_cast<int>(skeleton.at<uchar>(yaxis2+7,xaxis))==255)
  96.             {
  97.                 ++yaxis2;
  98.             }
  99.        
  100.             if(yaxis!=(*it2)[1])
  101.             {
  102.                 line(skeleton,Point(xaxis,(*it2)[1]),Point(xaxis,yaxis),color);
  103.                 writeToFile(xaxis,(*it2)[1],xaxis,yaxis,i);
  104.                 lines.push_back(Vec4i(xaxis,(*it2)[1],xaxis,yaxis)); //ERROR
  105.                 ++i;
  106.             }
  107.            
  108.             if(yaxis2!=(*it2)[1])
  109.             {
  110.                 line(skeleton,Point(xaxis,(*it2)[1]),Point(xaxis,yaxis2),color);
  111.                 writeToFile(xaxis,(*it2)[1],xaxis,yaxis2,i);
  112.                 lines.push_back(Vec4i(xaxis,(*it2)[1],xaxis,yaxis2)); //ERROR
  113.                 ++i;
  114.             }
  115.             --xaxis;
  116.             }
  117.         }
  118.     } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119.    
  120.     myfile.close();
  121.     }
  122.     void writeToFile(int x1,int y1,int x2,int y2,int i)
  123.     {
  124.         myfile << "line "<<i<<" starting point= ("<<x1<<","<<y1<<")\n"<<"line "<<i<<" ending point= ("<<x2<<","<<y2<<")\n";
  125.  
  126.     }
  127.    
  128.     Mat skeleton(Mat& img)
  129.     {
  130.         cv::threshold(img, img, 127, 255, cv::THRESH_BINARY);
  131.         cv::Mat skel(img.size(), CV_8UC1, cv::Scalar(0));
  132.         cv::Mat temp;
  133.         cv::Mat eroded;
  134.         cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));
  135.  
  136.         bool done;     
  137.         do
  138.         {
  139.           cv::erode(img, eroded, element);
  140.           cv::dilate(eroded, temp, element); // temp = open(img)
  141.           cv::subtract(img, temp, temp);
  142.           cv::bitwise_or(skel, temp, skel);
  143.           eroded.copyTo(img);
  144.  
  145.           done = (countNonZero(img) == 0);
  146.         } while (!done);
  147.         return skel;
  148.     }
  149. };
RAW Paste Data