Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include "opencv2\core\core.hpp"
- #include "opencv\cv.h"
- #include "opencv2\highgui\highgui.hpp"
- #include <iostream>
- #include <fstream>
- #define _USE_MATH_DEFINES
- #include "math.h"
- using namespace std;
- using namespace cv;
- class WallFinder
- {
- private:
- ofstream myfile;
- vector<Vec4i> lines;
- double deltaRho;
- double deltaTheta;
- int minVote;
- double minLength;
- double maxGap;
- public:
- WallFinder() : deltaRho(1), deltaTheta(M_PI/180), minVote(10), minLength(0.), maxGap(0.) {}
- void setMinVote(int minv) {
- minVote= minv;
- }
- void setLineLengthAndGap(double length,double gap) {
- minLength= length;
- maxGap= gap;
- }
- void findLines(Mat& skeleton)
- {
- lines.clear();
- HoughLinesP(skeleton,lines,deltaRho,deltaTheta,minVote,minLength,maxGap);
- }
- void showLinesOnImage(Mat& skeleton, Scalar color=Scalar(128))
- {
- int yaxis=0,xaxis=0,xaxis2=0,yaxis2=0;
- myfile.open("coordinates.txt", ios::out);
- for (vector<Vec4i>::const_iterator it=lines.begin(); it!=lines.end(); it++)
- {
- Point pt1((*it)[0],(*it)[1]);
- Point pt2((*it)[2],(*it)[3]);
- line( skeleton, pt1, pt2, color);
- writeToFile((*it)[0],(*it)[1],(*it)[2],(*it)[3]);
- }
- for (vector<Vec4i>::const_iterator it2=lines.begin(); it2!=lines.end(); it2++)
- {
- if((*it2)[0]==(*it2)[2])
- {
- yaxis=(*it2)[1];
- while(yaxis!=(*it2)[3]-1)
- {
- xaxis=(*it2)[0];
- xaxis2=(*it2)[0];
- while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis-1))==255)
- {
- --xaxis;
- }
- while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2+1))==255)
- {
- ++xaxis2;
- }
- if(xaxis!=(*it2)[0] && abs(xaxis-(*it2)[0])>5)
- {
- line(skeleton,Point(xaxis,yaxis),Point((*it2)[0],yaxis),color);
- writeToFile(xaxis,yaxis,(*it2)[0],yaxis);
- controlSecondaryLines(skeleton,xaxis,yaxis,(*it2)[0],yaxis);
- }
- if(xaxis2!=(*it2)[0] && abs(xaxis2-(*it2)[0])>5)
- {
- line(skeleton,Point((*it2)[0],yaxis),Point(xaxis2,yaxis),color);
- writeToFile((*it2)[0],yaxis,xaxis2,yaxis);
- controlSecondaryLines(skeleton,(*it2)[0],yaxis,xaxis2,yaxis);
- }
- --yaxis;
- }
- }
- if((*it2)[1]==(*it2)[3])
- {
- xaxis=(*it2)[2];
- while(xaxis!=(*it2)[0]-1)
- {
- yaxis=(*it2)[1];
- yaxis2=(*it2)[1];
- while (static_cast<int>(skeleton.at<uchar>(yaxis-1,xaxis))==255)
- {
- --yaxis;
- }
- while (static_cast<int>(skeleton.at<uchar>(yaxis2+1,xaxis))==255)
- {
- ++yaxis2;
- }
- if(yaxis!=(*it2)[1] && abs(yaxis-(*it2)[1])>5)
- {
- line(skeleton,Point(xaxis,(*it2)[1]),Point(xaxis,yaxis),color);
- writeToFile(xaxis,(*it2)[1],xaxis,yaxis);
- controlSecondaryLines(skeleton,xaxis,(*it2)[1],xaxis,yaxis);
- }
- if(yaxis2!=(*it2)[1] && abs(yaxis2-(*it2)[1])>5)
- {
- line(skeleton,Point(xaxis,yaxis2),Point(xaxis,(*it2)[1]),color);
- writeToFile(xaxis,yaxis2,xaxis,(*it2)[1]);
- controlSecondaryLines(skeleton,xaxis,yaxis2,xaxis,(*it2)[1]);
- }
- --xaxis;
- }
- }
- }
- myfile.close();
- controlThirtiaryLines(skeleton);
- }
- void writeToFile(int x1,int y1,int x2,int y2)
- {
- if(x1==x2)
- myfile << 1 << " "<< x1 << " " << y2 << " "<< x2 << " " << y1 <<endl;
- else
- myfile << 1 << " "<< x1 << " " << y1 << " "<< x2 << " " << y2<<endl;
- }
- Mat skeleton(Mat& img)
- {
- threshold(img, img, 50, 255, THRESH_BINARY);
- Mat skel(img.size(), CV_8UC1, Scalar(0));
- Mat temp;
- Mat eroded;
- Mat element = getStructuringElement(MORPH_CROSS, Size(3, 3));
- bool done;
- do
- {
- erode(img, eroded, element);
- dilate(eroded, temp, element);
- subtract(img, temp, temp);
- bitwise_or(skel, temp, skel);
- eroded.copyTo(img);
- done = (countNonZero(img) == 0);
- } while (!done);
- dilate(skel,skel,Mat(),Point(-1,-1),2);
- erode(skel,skel,Mat(),Point(-1,-1),2);
- return skel;
- }
- void controlSecondaryLines(Mat& skeleton, int x1, int y1, int x2, int y2, Scalar color=Scalar(128))
- {
- int xaxis,xaxis2,yaxis,yaxis2;
- if(x1==x2)
- {
- yaxis=y1;
- while(yaxis!=y2-1)
- {
- xaxis=x1;
- xaxis2=x1;
- while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis-1))==255)
- {
- --xaxis;
- }
- while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2+1))==255)
- {
- ++xaxis2;
- }
- if(xaxis!=x1 && abs(xaxis-x1)>5)
- {
- line(skeleton,Point(xaxis,yaxis),Point(x1,yaxis),color);
- writeToFile(xaxis,yaxis,x1,yaxis);
- controlSecondaryLines(skeleton,xaxis,yaxis,x1,yaxis);
- }
- if(xaxis2!=x1 && abs(xaxis2-x1)>5)
- {
- line(skeleton,Point(x1,yaxis),Point(xaxis2,yaxis),color);
- writeToFile(x1,yaxis,xaxis2,yaxis);
- controlSecondaryLines(skeleton,x1,yaxis,xaxis2,yaxis);
- }
- --yaxis;
- }
- }
- if(y1==y2)
- {
- xaxis=x2;
- while(xaxis!=x1-1)
- {
- yaxis=y1;
- yaxis2=y1;
- while (static_cast<int>(skeleton.at<uchar>(yaxis-1,xaxis))==255)
- {
- --yaxis;
- }
- while (static_cast<int>(skeleton.at<uchar>(yaxis2+1,xaxis))==255)
- {
- ++yaxis2;
- }
- if(yaxis!=y1 && abs(yaxis-y1)>5)
- {
- line(skeleton,Point(xaxis,y1),Point(xaxis,yaxis),color);
- writeToFile(xaxis,y1,xaxis,yaxis);
- controlSecondaryLines(skeleton,xaxis,y1,xaxis,yaxis);
- }
- if(yaxis2!=y1 && abs(yaxis2-y1)>5)
- {
- line(skeleton,Point(xaxis,yaxis2),Point(xaxis,y1),color);
- writeToFile(xaxis,yaxis2,xaxis,y1);
- controlSecondaryLines(skeleton,xaxis,yaxis2,xaxis,y1);
- }
- --xaxis;
- }
- }
- }
- void controlThirtiaryLines(Mat& skeleton)
- {
- int a=0,i=0,j=0,k=0,l=0;
- char *inname = "coordinates.txt";
- ifstream infile(inname);
- while (infile>>a>>i>>j>>k>>l)
- {
- findThirtiaryLines(skeleton,i,j,k,l);
- }
- infile.close();
- }
- void findThirtiaryLines(Mat& skeleton, int x1, int y1, int x2, int y2, Scalar color=Scalar(128))
- {
- int xaxis,xaxis2,yaxis,yaxis2=0,tempYaxis,tempYaxis2;
- if(x1==x2)
- {
- yaxis=y2;
- while(yaxis!=y1-1)
- {
- xaxis=x1;
- xaxis2=x1;
- tempYaxis=yaxis;
- tempYaxis2=yaxis;
- // control right side
- while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis+1))!=255)
- {
- if(static_cast<int>(skeleton.at<uchar>(yaxis,xaxis+1))==128 || xaxis+1==skeleton.cols)
- {
- xaxis=x1;
- break;
- }
- else
- {
- ++xaxis;
- }
- }
- if (xaxis!=x1)
- {
- int temp=xaxis;
- while (static_cast<int>(skeleton.at<uchar>(yaxis,temp+1))==255)
- {
- ++temp;
- }
- if(temp!=xaxis)
- {
- line(skeleton,Point(xaxis,yaxis), Point(temp,yaxis),color);
- controlSecondaryLines(skeleton,xaxis,yaxis,temp,yaxis);
- }
- }
- // control left side
- while (static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2-1))!=255)
- {
- if(static_cast<int>(skeleton.at<uchar>(yaxis,xaxis2-1))==128 || xaxis2-1==0)
- {
- xaxis2=x1;
- break;
- }
- else
- {
- --xaxis2;
- }
- }
- if (xaxis2!=x1)
- {
- int temp=xaxis2;
- while (static_cast<int>(skeleton.at<uchar>(yaxis,temp-1))==255)
- {
- --temp;
- }
- if(temp!=xaxis2)
- {
- line(skeleton, Point(temp,yaxis), Point(xaxis2,yaxis),color);
- controlSecondaryLines(skeleton,temp,yaxis,xaxis2,yaxis);
- }
- }
- // control up side
- while (static_cast<int>(skeleton.at<uchar>(tempYaxis-1,xaxis))!=255)
- {
- if(static_cast<int>(skeleton.at<uchar>(tempYaxis-1,xaxis))==128 || tempYaxis-1==0)
- {
- tempYaxis=yaxis;
- break;
- }
- else
- {
- --tempYaxis;
- }
- }
- if (tempYaxis!=yaxis)
- {
- int temp=tempYaxis;
- while (static_cast<int>(skeleton.at<uchar>(temp-1,xaxis))==255)
- {
- --temp;
- }
- if(temp!=tempYaxis)
- {
- line(skeleton,Point(xaxis,tempYaxis),Point(xaxis,temp),color);
- controlSecondaryLines(skeleton,xaxis,tempYaxis,xaxis,temp);
- }
- }
- // control down side
- while (static_cast<int>(skeleton.at<uchar>(tempYaxis2+1,xaxis))!=255)
- {
- if(static_cast<int>(skeleton.at<uchar>(tempYaxis2+1,xaxis))==128 || tempYaxis2+1==skeleton.rows)
- {
- tempYaxis2=yaxis;
- break;
- }
- else
- {
- ++tempYaxis2;
- }
- }
- if (tempYaxis2!=yaxis)
- {
- int temp=tempYaxis2;
- while (static_cast<int>(skeleton.at<uchar>(temp+1,xaxis))==255)
- {
- ++temp;
- }
- if(temp!=tempYaxis2)
- {
- line(skeleton,Point(xaxis,temp),Point(xaxis,tempYaxis2),color);
- controlSecondaryLines(skeleton,xaxis,temp,xaxis,tempYaxis2);
- }
- }
- --yaxis;
- }
- }
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement