OpenCV车道线检测直线筛选问题

huyufeng0407 2015-02-02 12:09:32
我的思路是对一个视频里面的每一帧进行处理,先将其变为灰度图,再进行canny变换,再进行霍夫变化,后面在筛选直线的时候总是不能找到一个很好的效果(图中我是很无脑的直接把两旁图都截掉了)
#include<iostream>
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include "threshold.h"

using namespace std;

int main(){
CvCapture *capture = cvCreateFileCapture("F:\\cvsource\\1.avi");//注意读取不在工程目录下文件时的路径要加双斜杠
IplImage *img = cvQueryFrame(capture);

//读取矩阵
CvMemStorage *memstorageTest=cvCreateMemStorage(0);
CvFileStorage *warp_read=cvOpenFileStorage("F:\\cvsource\\1.xml",memstorageTest,CV_STORAGE_READ);//矩阵所在的xml文件名
CvMat *map_matrix = cvCreateMat(3,3,CV_32FC1);
map_matrix = (CvMat*)cvReadByName(warp_read,NULL,"WarpMatrix",NULL);//读取矩阵,注意双括号里面是矩阵的名字

//设置原图像的ROI范围
int x = 65,y = 151;//这个y值就是要修改的,尽量裁掉天空,不然会给处理带来挺大困难
int width = img->width , height = img->height - y;



cvNamedWindow("OriginalView");//创建显示窗口
cvNamedWindow("IPMview");
cvNamedWindow("CannyShow");
cvNamedWindow("HoughShow");
int frame=0;//当前帧数
while (img!=NULL)//当读取到空的时候,即视频播放完毕则停止处理
{
frame++;
cout<<frame<<endl;
img = cvQueryFrame(capture);//不断读取下一帧

cvSetImageROI(img,cvRect(x,y,width,height));//设置ROI
IplImage *ImageCut = cvCreateImage(cvGetSize(img),8,3);
cvCopy(img,ImageCut);//将原图像的ROI赋给新图像ImageCut
//创建用于变换的图像
IplImage *ImageIPM = cvCreateImage(cvGetSize(ImageCut),8,3);
IplImage *ImageHough = cvCreateImage(cvGetSize(ImageCut),8,3);
//反透视变换
cvShowImage("OriginalView",ImageCut);
cvWarpPerspective(ImageCut,ImageIPM,map_matrix);
cvWarpPerspective(ImageCut,ImageHough,map_matrix);
cvShowImage("IPMview",ImageIPM);
//Canny变换
IplImage *ImageCanny = cvCreateImage(cvGetSize(ImageIPM),8,1);
//int best = otsuThreshold(ImageIPM);
//the best is said to be 40 by Huang Yuhong
cvCanny(ImageIPM,ImageCanny,40,100);
cvShowImage("CannyShow",ImageCanny);
//hough直线检测
CvMemStorage *storage = cvCreateMemStorage();
CvSeq *lines = 0;
///////////////////////////////////////
lines = cvHoughLines2(ImageCanny,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,20,30,10);
//lines = cvHoughLines2(ImageCanny,storage,CV_HOUGH_STANDARD,1,CV_PI/180,30,30,5);
printf("Lines number: %d\n",lines->total);
for (int i=0;i<lines->total;i++)
{
CvPoint *line = (CvPoint *)cvGetSeqElem(lines,i);

//double cmp_factor = line->y * 1.0 / line->x ;
if(line[1].x>565) continue;
if(line[1].x<270) continue;
// double cmp_factor = (line[0].y - line[1].y)*1.0/(line[0].x - line[1].x);
// if((cmp_factor<5&&cmp_factor>0)||(cmp_factor>-5&&cmp_factor<0)) continue;
cvLine(ImageHough,line[0],line[1],CV_RGB(255,255,0),5,CV_AA);
}
//////////////////////////////////////
/*lines = cvHoughLines2(ImageCanny,storage,CV_HOUGH_STANDARD,1,CV_PI/180,50,0,0);
printf("Lines number: %d\n",lines->total);
for (int i=0;i<lines->total;i++)
{
float *line = (float *)cvGetSeqElem(lines,i);
float rho = line[0];
float theta = line[1];
CvPoint pt1,pt2;
double a = cos(theta);
double b = sin(theta);
if (fabs(a)<0.001)
{
pt1.x = pt2.x = cvRound(rho);
pt1.y = 0;
pt2.y = ImageCanny->height;
}
else if (fabs(b)<0.001)
{
pt1.y = pt2.y = cvRound(rho);
pt1.x = 0;
pt2.x = ImageCanny->width;
}
else
{
pt1.x = 0;
pt1.y = cvRound(rho/b);
pt2.x = cvRound(rho/a);
pt2.y = 0;
}

cvLine(ImageHough,pt1,pt2,CV_RGB(255,255,0),1,8);
}
*/
///////////////////////////////////
cvShowImage("HoughShow",ImageHough);

cvWaitKey(30);

cvReleaseImage(&ImageCut);
cvReleaseImage(&ImageIPM);
cvReleaseImage(&ImageCanny);
cvReleaseImage(&ImageHough);
}
return 0;
}
。还有,找到车道线后我得到的坐标是我进行反透视变换后的图中的坐标,那么我该如何将其转换到原图中呢?
...全文
5462 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxg学java 2018-06-25
  • 打赏
  • 举报
回复
2212224994@qq.com
Geek_Tank 2017-07-07
  • 打赏
  • 举报
回复
想把车道线从反透视图上变回来,可以用 cv::warpPerspective(perspectiveImage,originalImage,transform,cv::Size(perspectiveImage.rows,perspectiveImage.cols),cv::INTER_LINEAR | cv::WARP_INVERSE_MAP); --perspectiveImage是反透视变换后得到的图 --originalImage是将反透视图变回来的目标图 --transform是你之前做反透视变换的时候,从原图到反透视图的转移矩阵 --WARP_INVERSE_MAP表示反变换
erge0801 2017-06-30
  • 打赏
  • 举报
回复
博主,你好,能发我一份你的视频1.avi和那个矩阵1.xml吗?万分感谢!!1019503628@qq.com
五仁月饼哭了 2017-05-03
  • 打赏
  • 举报
回复
同求1.xml文件,能给我一份吗,想学习学习这方面的知识,nupterwang@163.com
baidu_21426767 2017-03-06
  • 打赏
  • 举报
回复
你有博主的1.xml文件吗?有的话发一份谢谢,shilusui16@sina.com.cn
qq_36201903 2016-10-27
  • 打赏
  • 举报
回复
博主,我最近也在做车道线检测,发给我1.avi吗?1289891080@qq.com
zzxxffbottle 2016-09-27
  • 打赏
  • 举报
回复
anchorandy@126.com
zzxxffbottle 2016-09-27
  • 打赏
  • 举报
回复
博主,可以发给我一份xml文件吗?
lkjhpl001 2016-07-28
  • 打赏
  • 举报
回复
博主你好,大三新手最近在研究车道线的识别,我大致了解这个矩阵是干什么用的了,但是并不知道这个矩阵的格式,能给我发一份那个1.xml吗? 782364821@qq.com
onearrow1 2016-06-06
  • 打赏
  • 举报
回复
博主你好,能给我发一份1.xml吗?跪谢 337512784@qq.com
wenq123456 2016-04-13
  • 打赏
  • 举报
回复
博主你好,能发给我一份1.xml吗,万分感谢1252253835@qq.com
lighting_soon 2016-02-18
  • 打赏
  • 举报
回复
能发给我一份1.xml吗?
lighting_soon 2016-02-18
  • 打赏
  • 举报
回复
我是初学者 也在做透视变换 万分感谢!!
windisbig 2015-07-24
  • 打赏
  • 举报
回复
請問1.xml己做的嗎 可以提供嗎 最近剛好在研究車道辨識
赵4老师 2015-03-17
  • 打赏
  • 举报
回复
引用 9 楼 fairywisodm 的回复:
你做车道线主要做什么应用
十有八九跟自动驾驶有关。 我脑中浮现出电影《虎口脱险》中那个可怜的沿车道线飞奔的德国兵。
fairywisodm 2015-03-17
  • 打赏
  • 举报
回复
你做车道线主要做什么应用
qq_26424871 2015-03-09
  • 打赏
  • 举报
回复
十分感谢分享
sinat_25882019 2015-02-07
  • 打赏
  • 举报
回复
求逆矩阵的函数是cvInvert,百度一下就会了
sinat_25882019 2015-02-07
  • 打赏
  • 举报
回复
你可以用透视变化,但是矩阵使用的是逆矩阵,逆矩阵有函数可以求
此后三年 2015-02-03
  • 打赏
  • 举报
回复
引用 3 楼 huyufeng0407 的回复:
你好!~我现在是将车道线标注在反透视之后的图上,请问该怎么转换到原图呢?
坐标已经变了, 很难和原图建立起关系
加载更多回复(4)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧