数字图像处理——跑道识别源码opencv+vs2013
#include<opencv2/opencv.hpp>#include<iostream>#include<math.h>#include<algorithm>#include<highgui.h>using namespace cv;using namespace std;//输入一堆直线,返回每条直线的斜率和截距vector <
·
#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;
}
效果如下图:
更多推荐
所有评论(0)