资源简介
本程序基于OpenCv给出了一种车道线检测的算法,首先通过OSTU进行二值化处理,随后通过改进的霍夫变化进行车道线检测,具有比较好的效果。

代码片段和文件信息
//---------------------车道线检测-------------------------//
/*可以处理摄像头,也可以处理视频文件*/
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
CvCapture* g_capture = NULL;
IplImage* PreProcessImg = NULL;
CvPoint point1 point2 point3 pointend pointtemp;
CvPoint pointmeet;//相交点
vector points;
vector pointsleft;
vector pointsright;
//结构体1,左侧的线,右侧的线
struct line
{
CvPoint pointbottom;
CvPoint pointtop;
}lineleft lineright;
//结构体2
struct greycount
{
uchar grey;
int count;
};
//大津阈值车道从背景中分离出来
void ImproveOTSU(IplImage* image IplImage* image2)
{
//int lc = cvRound((image->height / 2) + 1);
//cvSetImageROI(image cvRect(0 lc image->width image->height));
//如果只对下半幅图像做大津阈值,效果不好
//cvThreshold(image image 80 255 CV_THRESH_BINARY);//速度慢,与OSTU差100ms
//cvThreshold(image image2 180 235 CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//BINARY能检测出视频3-2
cvThreshold(image image2 0 255 CV_THRESH_OTSU);//改变阈值没效果
//cvResetImageROI(image);
//cvCopy(image image2);
}
//改进的hough变换检测车道
int Hough(IplImage* image float* tabSin float *tabCos int *accum int numrho int &predistance1 int &preangle1 int &predistance2 int &preangle2)
{
int r angle1 = 1 angle2 = 1 distance1 = 0 distance2 = 0 n = 0;
long j;
int angelstart1 = 40;
int angleend1 = 70;
int anglestart2 = 110;
int angleend2 = 160;
if (preangle1 != 0)
{
angelstart1 = preangle1 - 5;
angleend1 = preangle1 + 5;
}
if (preangle2 != 0)
{
anglestart2 = preangle2 - 5;
angleend2 = preangle2 + 5;
}
int step = image->widthStep / sizeof(uchar);
uchar *data0 = (uchar *)image->imageData;
for (int i = image->height / 2; i < image->height; i++)
{
for (j = 0; j < image->width; j++)
{
if (data0[i*step + j] == 255)//??
{
for (n = angelstart1; n < angleend1; n++)//40--70
{
r = cvRound(j * tabCos[n] + i * tabSin[n]);
r += (numrho - 1) / 2;
accum[(n + 1) * (numrho + 2) + r + 1]++;
}
for (n = anglestart2; n < angleend2; n++)//110--160
{
r = cvRound(j * tabCos[n] + i * tabSin[n]);
r += (numrho - 1) / 2;
accum[(n + 1) * (numrho + 2) + r + 1]++;
}
}
}
}
//printf(“preangle1preangle2:%d %d\n “preangle1preangle2);
//找出数值最大的小格
int numbermax1 = 30 numbermax2 = 30;
for (r = 0; r < numrho; r++)//angle1\angle2 ????
{
for (n = 40; n < 70; n++)
{
int base = (n + 1) * (numrho + 2) + r + 1;
if (accum[base] > numbermax1)
{
numbermax1 = accum[base];
angle1 = n;
distance1 = cvRound(r - (numrho - 1)*0.5f);
}
}
for (n = 110; n<160; n++)
{
int base = (n + 1) * (numrho + 2) + r + 1;
if (accum[base] > numbermax2)
{
numbermax2 = accum[base];
angle2 = n;
distance2 = cvRound(r - (numrho - 1)*0.5f);
}
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 18490 2017-11-20 18:23 车道线.cpp
文件 6457025 2017-11-21 08:59 1.mp4
----------- --------- ---------- ----- ----
6475515 2
相关资源
- 基于OpenCV的数字识别468815
- 使用opencv去掉二值化图像中黑色面积
- opencv环境配置
- win10 64位下编译的opencv4.5.5库,opencv
- 基于车道线标定的自动标定方法
- NVIDIAOpticalFlowSDK-79c6cee80a2df9a196f20afd6
- opencv_contrib-3.4.0.zip
- opencv2.4.9源码分析——SIFT
- 用两个摄像头实现,双目标定,双目
- opencv_traincascade训练分类器,手势识别
- opencv3.0交叉编译用parallel.cpp
- 基于opencv的图像识别识别图像中的色
- 基于openCV的识别特定颜色区域
- 基于OpenCV的分水岭算法实现
- QT+opencv+OCR 身份证号码,银行卡号识别
- opencv视频特定颜色区域识别
- 把RGB转换为HSV和HSI然后根据黄色和蓝
- opencv视觉测距
- 基于Qt和opencv的身份证号码识别系统
- opencv_ffmpeg249.dll
- SfM稀疏三维点云重建--完整工程文件
- 基于opencv的数人头程序源代码
- 利用OpenCV中的Stitcher类实现全景图像拼
- opencv实现的sift算法源码,包含了图像
- openCV 上的小波变换
- 基于OPENCV的车牌识别系统设计
- 617张国内车牌60-17bmp图片用于OpenCV正样
- hog特征提取,c版本代码
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
- 基于Opencv实现的图像纠偏
评论
共有 条评论