#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<highgui.h>

using namespace cv;
using namespace std;


//输入一堆直线,返回每条直线的斜率和截距
vector <Point2f> get_lines_fangcheng(vector<Vec4i> lines)
{
	float k = 0; //直线斜率
	float b = 0; //直线截距
	vector <Point2f> lines_fangcheng;
	for (unsigned int i = 0; i<lines.size(); i++)
	{

		k = (double)(lines[i][3] - lines[i][1]) / (double)(lines[i][2] - lines[i][0]); //求出直线的斜率
		b = (double)lines[i][1] - k * (double)lines[i][0];                              //求出直线的截距
		lines_fangcheng.push_back(Point2f(k, b));
	}
	return lines_fangcheng;
}


//主函数
int main(int argc, char*argv)
{
  Mat src;
  src = imread("E://run.jpg");
  if (!src.data)
  {
	printf("could not load image...\n");
	return -1;
    }
namedWindow("原图", WINDOW_NORMAL);
imshow("原图", src);

Mat gray_src, dst, dst1;

medianBlur(src, dst, 3);            //对噪声比较敏感,故须先做中值滤波
imshow("中值", dst);

cvtColor(dst, gray_src, CV_BGR2GRAY); //灰度化

Canny(gray_src, dst, 20, 30, 3);     //检测边缘
imshow("canny", dst);

double len;
vector<Vec4i>plines;  //定义一个存放直线信息的向量
vector <Point2f> a;   //存储斜率和截距

//Hough直线检测

HoughLinesP(dst,plines, 1, CV_PI / 180, 70, 100, 50);
 a = get_lines_fangcheng(plines);
 int i = 0;

 for (i = 0; i < plines.size(); i++)
 {
 
	 double x1 = a[i].x;        //得到斜率
	 double x2 = a[i].y;       //得到截距
	
	 if ((x1>0.25 &&x1<3) || (x1 <-0.3 && x1>-1.8) )  //过滤斜率不对的直线
	 {
	
			 Vec4i point1 = plines[i];             
			 len = pow(point1[2] - point1[0], 2) + pow(point1[3] - point1[1],2); 
			 len = sqrt(len);                    //计算线段的长度


			 if (point1[1]>200  &&  len>150 &&  x1>0){  //过滤
				 if (point1[0] < 500){                  //沿直线调整起点
					 double p = (500 - point1[0]) *x1;
					 point1[0] = 500;
					 point1[1] += p;
				 }
				 if (point1[1] < 500){
					 double p = (500 - point1[1]) / x1;
					 point1[1] = 500;
					 point1[0] += p;
				 }
				 line(src, Point(point1[0], point1[1]), Point(point1[2], point1[3]), Scalar(255, 255, 0), 2, LINE_AA);//绘制符合的直线
			 }

			 else if ( len>220 && x1<0){     //过滤直线
				 if (point1[2] >600){        //沿直线调整终点
					 double p = (600 - point1[2]) *x1;
					 point1[2] = 600;
					 point1[3] += p;
				 }
				 if (point1[3] < 500){
					 double p = (500 - point1[3]) / x1;
					 point1[3] = 500;
					 point1[2] += p;
				 }
				 line(src, Point(point1[0], point1[1]), Point(point1[2], point1[3]), Scalar(255, 255, 0), 2, LINE_AA);//绘制符合的直线
			 }
		 }
 }

namedWindow("result", WINDOW_NORMAL);
imshow("result", src);
imwrite("E://result.jpg", src);
waitKey(0);
return 0;


}

效果如下图:

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐