想用HOUGH检测出垂线,用加条件表达式的方法做得应该是很简单的可是结果老出错,求达人
帮忙分析下~~~~~~~~
void SlImgProcess::HoughLines()
{
IplImage* src = 0;
IplImage* dst = 0;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
int i;
if (m_pImg->nChannels==3)
{
src = cvCreateImage(cvGetSize(m_pImg), IPL_DEPTH_8U, 1);
cvCvtColor(m_pImg, src, CV_BGR2GRAY);
}
else
{
src = cvCloneImage( m_pImg );
}
cvFlip(src);
dst = cvCreateImage( cvGetSize(src), 8, 1 );
m_pImgOut = cvCreateImage( cvGetSize(src), 8, 3 );
cvCanny( src, dst, 50, 200, 3 );
cvCvtColor( src, m_pImgOut, CV_GRAY2BGR );
lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 100, 20 );
for( i = 0; i < lines->total; i++ )
{
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
//用直线平方和表示总长条件,我用的参数是30000,已经很大了。。用X坐标相同来限制成垂线
if(((line[0].x-line[1].x)*(line[0].x-line[1].x) + (line[0].y-line[1].y)*(line[0].y-line[1].y) > 30000)
&&(line[0].x=line[1].x))
cvLine( m_pImgOut, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );
}
cvFlip(m_pImgOut); cvReleaseMemStorage(&storage );
cvReleaseImage( &src );
cvReleaseImage( &dst );
}结果是会将特别短的垂线都检测出来,即使我将参数30000调成40000,短垂线还存在,但原本有的长垂线反倒是没了这怎么一回事???
帮忙分析下~~~~~~~~
void SlImgProcess::HoughLines()
{
IplImage* src = 0;
IplImage* dst = 0;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
int i;
if (m_pImg->nChannels==3)
{
src = cvCreateImage(cvGetSize(m_pImg), IPL_DEPTH_8U, 1);
cvCvtColor(m_pImg, src, CV_BGR2GRAY);
}
else
{
src = cvCloneImage( m_pImg );
}
cvFlip(src);
dst = cvCreateImage( cvGetSize(src), 8, 1 );
m_pImgOut = cvCreateImage( cvGetSize(src), 8, 3 );
cvCanny( src, dst, 50, 200, 3 );
cvCvtColor( src, m_pImgOut, CV_GRAY2BGR );
lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 100, 20 );
for( i = 0; i < lines->total; i++ )
{
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
//用直线平方和表示总长条件,我用的参数是30000,已经很大了。。用X坐标相同来限制成垂线
if(((line[0].x-line[1].x)*(line[0].x-line[1].x) + (line[0].y-line[1].y)*(line[0].y-line[1].y) > 30000)
&&(line[0].x=line[1].x))
cvLine( m_pImgOut, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );
}
cvFlip(m_pImgOut); cvReleaseMemStorage(&storage );
cvReleaseImage( &src );
cvReleaseImage( &dst );
}结果是会将特别短的垂线都检测出来,即使我将参数30000调成40000,短垂线还存在,但原本有的长垂线反倒是没了这怎么一回事???
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货