车道检测过程中遇到的问题

1.使用cvLine画线无显示,原图错乱。
原因:原图为灰度图, 在灰度图上, 无论怎么设置color, cvCircle、cvLine 只能画出黑白两种颜色。用这些画图函数在RGB图上画,才能画出来彩色。

2. 如下左图,红线都是由 cvHoughLines2函数得到的直线, 共有5条车道线,但每条车道线都由很多条重叠而成,如何将这重叠的多条线精简为一条线?
车道检测过程中遇到的问题 - hudan.love - HDaniel的博客 车道检测过程中遇到的问题 - hudan.love - HDaniel的博客
答:经过多次调试、试验,发现这些很相近、重叠的线满足以下规律:角度theta(由函数直接得到的角度为弧度制,需转为角度制)相差小于10度;直线到原点的长度差小于30.若同时满足这两个条件,则可以合并为同一条直线。处理后的效果如右图所示。
 
3.线的两点为什么是这样计算?

CvPoint pt01,pt02;
//确定直线上的两个点,取1000是因为它足够大,可以确保这两个点在图像外
pt01.x=cvRound(rho*cos(theta)-1000*sin(theta));
pt01.y=cvRound(rho*sin(theta)+1000*cos(theta));
pt02.x=cvRound(rho*cos(theta)+1000*sin(theta));
pt02.y=cvRound(rho*sin(theta)-1000*cos(theta));

下图可以用于解释以上代码:
车道检测过程中遇到的问题 - hudan.love - HDaniel的博客
 
 

4. rho,theta在图像坐标中有什么规则?

5.MFC中,若线程内定义一个变量,且两次启动该线程,两线程间该变量会互相受影响。为什么?

 

附:车道检测部分代码:
假设 pBkMat为装有背景的数组

float theta_save[10]={0}; //用于保存确定下来的车道线的角度和rho,用于剩余的检测到的线比较,去重复
float rho_save[10]={0};
int num_line=0; //车道线计数
int line_true=0; //是否画车道线的标志位
CvSeq* lines = 0;
IplImage *color_backImage;
cvThreshold(pBkMat,pFtImg,180,255.0,CV_THRESH_BINARY);//二值化背景,得到车道
cvCanny(pFtImg,pFtImg,30,150,3); //边缘检测

unsigned char* i_data=(unsigned char *)pFtImg->imageData; //像素数据的首地址

for(int m_h=0;m_h<(pFtImg->height)/2;m_h++) //仅保留图像下半部分的数据,上半部分干扰太多
for(int n_w=0;n_w<pFtImg->width;n_w++)
i_data[m_h*pFtImg->widthStep+n_w]=0;

lines = cvHoughLines2( pFtImg, storage, CV_HOUGH_STANDARD, 1, CV_PI/180,60, 0, 0 );//用Hough变换检测直线
color_backImage = cvCreateImage( cvGetSize(pFtImg), 8, 3 );
cvCvtColor( pFtImg, color_backImage, CV_GRAY2BGR );
//注意:在灰度图上不能画彩色线,因此要把单通道图转为3通道图

cvNamedWindow("background",1);

for(int o=0;o<MIN(lines->total,100);o++)
{
float* line = (float*)cvGetSeqElem(lines,o); //获取该直线的参数,rho和角度theta
float rho=line[0];
float theta=line[1];

line_true=1;
if(o!=0)
{
for(int p_line=0;p_line<num_line;p_line++)
{

//根据第2问中的方法去重复
if( (abs(theta_save[p_line]*180/CV_PI-theta*180/CV_PI)<10) && (abs(rho_save[p_line]-rho)<30) )
{
line_true=0;
break;
}
}
}

if(line_true==1)
{
theta_save[num_line]=theta; //将确定的车道线保存到数组
rho_save[num_line]=rho;
num_line++;

CvPoint pt01,pt02;

//确定直线上的两个点,取1000是因为它足够大,可以确保这两个点在图像外
pt01.x=cvRound(rho*cos(theta)-1000*sin(theta));
pt01.y=cvRound(rho*sin(theta)+1000*cos(theta));
pt02.x=cvRound(rho*cos(theta)+1000*sin(theta));
pt02.y=cvRound(rho*sin(theta)-1000*cos(theta));

cvLine( color_backImage, pt01, pt02, CV_RGB(0,0,255), 1, CV_AA, 0 );
cvShowImage("background",color_backImage);
}
//sprintf(CntC,"%f\n%f\n",theta*180/CV_PI,rho); //for debug
// AfxMessageBox(CntC);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值