00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #if !defined LINEF
00019 #define LINEF
00020
00021 #include <opencv2/core/core.hpp>
00022 #include <opencv2/imgproc/imgproc.hpp>
00023 #define PI 3.1415926
00024
00025 class LineFinder {
00026
00027 private:
00028
00029
00030 cv::Mat img;
00031
00032
00033
00034 std::vector<cv::Vec4i> lines;
00035
00036
00037 double deltaRho;
00038 double deltaTheta;
00039
00040
00041
00042 int minVote;
00043
00044
00045 double minLength;
00046
00047
00048 double maxGap;
00049
00050 public:
00051
00052
00053
00054
00055 LineFinder() : deltaRho(1), deltaTheta(PI/180), minVote(10), minLength(0.), maxGap(0.) {}
00056
00057
00058 void setAccResolution(double dRho, double dTheta) {
00059
00060 deltaRho= dRho;
00061 deltaTheta= dTheta;
00062 }
00063
00064
00065 void setMinVote(int minv) {
00066
00067 minVote= minv;
00068 }
00069
00070
00071 void setLineLengthAndGap(double length, double gap) {
00072
00073 minLength= length;
00074 maxGap= gap;
00075 }
00076
00077
00078 std::vector<cv::Vec4i> findLines(cv::Mat& binary) {
00079
00080 lines.clear();
00081 cv::HoughLinesP(binary,lines,deltaRho,deltaTheta,minVote, minLength, maxGap);
00082
00083 return lines;
00084 }
00085
00086
00087 void drawDetectedLines(cv::Mat &image, cv::Scalar color=cv::Scalar(255,255,255)) {
00088
00089
00090 std::vector<cv::Vec4i>::const_iterator it2= lines.begin();
00091
00092 while (it2!=lines.end()) {
00093
00094 cv::Point pt1((*it2)[0],(*it2)[1]);
00095 cv::Point pt2((*it2)[2],(*it2)[3]);
00096
00097 cv::line( image, pt1, pt2, color);
00098
00099 ++it2;
00100 }
00101 }
00102
00103
00104
00105
00106
00107 std::vector<cv::Vec4i> removeLinesOfInconsistentOrientations(
00108 const cv::Mat &orientations, double percentage, double delta) {
00109
00110 std::vector<cv::Vec4i>::iterator it= lines.begin();
00111
00112
00113 while (it!=lines.end()) {
00114
00115
00116 int x1= (*it)[0];
00117 int y1= (*it)[1];
00118 int x2= (*it)[2];
00119 int y2= (*it)[3];
00120
00121
00122 double ori1= atan2(static_cast<double>(y1-y2),static_cast<double>(x1-x2))+PI/2;
00123 if (ori1>PI) ori1= ori1-2*PI;
00124
00125 double ori2= atan2(static_cast<double>(y2-y1),static_cast<double>(x2-x1))+PI/2;
00126 if (ori2>PI) ori2= ori2-2*PI;
00127
00128
00129 cv::LineIterator lit(orientations,cv::Point(x1,y1),cv::Point(x2,y2));
00130 int i,count=0;
00131 for(i = 0, count=0; i < lit.count; i++, ++lit) {
00132
00133 float ori= *(reinterpret_cast<float *>(*lit));
00134
00135
00136 if (std::min(fabs(ori-ori1),fabs(ori-ori2))<delta)
00137 count++;
00138
00139 }
00140
00141 double consistency= count/static_cast<double>(i);
00142
00143
00144 if (consistency < percentage) {
00145
00146 (*it)[0]=(*it)[1]=(*it)[2]=(*it)[3]=0;
00147
00148 }
00149
00150 ++it;
00151 }
00152
00153 return lines;
00154 }
00155 };
00156
00157
00158 std::vector<cv::Vec4i> convert2Matlab(const std::vector<cv::Vec4i>& ori)
00159 {
00160 cv::Vec4i vi;
00161 std::vector<cv::Vec4i> vout;
00162
00163 for(uint i=0;i<ori.size();i++)
00164 {
00165 vi[0] = ori[i][1];
00166 vi[1] = ori[i][0];
00167 vi[2] = ori[i][3];
00168 vi[3] = ori[i][2];
00169
00170 vout.push_back(vi);
00171 }
00172
00173 return vout;
00174 }
00175
00176 #endif