OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 19713|回复: 17

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

[复制链接]
发表于 2011-9-27 17:15:16 | 显示全部楼层 |阅读模式
#include "stdafx.h"
#include "stdio.h"
#include "cv.h"
#include "highgui.h"


int _tmain(int argc, _TCHAR* argv[])
{

        LARGE_INTEGER freq;
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim;

    QueryPerformanceFrequency(&freq);
    dfFreq = (double)freq.QuadPart;  
                //初始化从文件中获取视频

    CvCapture* capture = cvCaptureFromFile( "D:\\360\\Q.mp4" );
        if (!capture)
        {
                printf("unable to load a video");
            cvWaitKey(0);
            exit(0);
        }
        //创建窗口
        cvNamedWindow("Source Video", 1);
        cvNamedWindow("Destination Video", 1);
       
        IplImage* pImgFrame;
        IplImage* pImgEdge = 0;
        IplImage* pImgGray = 0;
        IplImage* pImgSmooth = 0;
        //动态内存存储器


        CvMemStorage* storage=cvCreateMemStorage(0);  //cvCreateMemStorage 用于创建一内存块并返回指向块首的指针
   
        //CvSeq 定义非固定元素的序列,是所有OpenCV动态数据结构的基础
        CvSeq* lines=NULL;/*The detected lines will be stored here*/

        //获得视频获取结构的帧率
        double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
        printf("fps=%d n",(int)fps);
       
        //CvSize以像素为单位定义矩形框的大小
        CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
                (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
        printf("frame (w, h) = (%d, %d)n",size.width,size.height);
        /*Creating the Video writer If you do not know about the Video writer study this post and come back to tis line*/
       
        int counter=0;
        //定义矩形框的偏离以及长和宽
        CvRect ROI_rect_src;
        ROI_rect_src.x = 0;
        ROI_rect_src.y = (size.height*1)/2;
        ROI_rect_src.width = size.width;
        ROI_rect_src.height = (size.height/8)*4;
        while( (pImgFrame = cvQueryFrame(capture)) != NULL ) //cvQueryFrame是从视频中抓取并返回一帧图像
        {
           counter++;
       
       QueryPerformanceCounter(&freq);
       QPart1 = freq.QuadPart;
      
           //创建图像头并分配数据
           pImgGray = cvCreateImage(cvGetSize(pImgFrame),IPL_DEPTH_8U,1);
           pImgEdge = cvCreateImage(cvSize(pImgFrame->width,pImgFrame->height),IPL_DEPTH_8U,1);
           pImgSmooth = cvCreateImage(cvSize(pImgFrame->width,pImgFrame->height),IPL_DEPTH_8U,1);

           /*gray-scale color images*/
           cvCvtColor(pImgFrame, pImgGray, CV_BGR2GRAY);

           /*Gaussian filtering*/
           cvSmooth(pImgGray,pImgSmooth,CV_GAUSSIAN,3,0,0);


           /*Canny Edge Detection*/
           cvCanny(pImgSmooth, pImgEdge, 40, 120, 3);


           /*Detect straight lines*/
       cvSetImageROI(pImgEdge,ROI_rect_src);  //cvSetImageROI的功能是基于给定的矩形设置图像的ROI(感兴趣区域)
       cvShowImage("pImgEdge",pImgEdge);
           //cvHoughLines2利用Hough变换在二值图像中寻找直线
       lines=cvHoughLines2(pImgEdge,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,50,5,5);
       cvResetImageROI(pImgEdge);
       /*All detected lines marked*/
           int i;
           for(i = 0; i < lines->total; i++)
           {
                   CvPoint* point = (CvPoint*)cvGetSeqElem(lines,i);//cvGetSeqElem返回索引指定的元素指针
                   double slope = fabs (((double)(point[1].y - point[0].y))/((double)(point[1].x - point[0].x)));
                   if((slope > 0.3) && (slope < 1000))
                   {
                           CvPoint Point0;
                           Point0.x = point[0].x;
                           Point0.y = point[0].y + ROI_rect_src.y;
                           CvPoint Point1;
                           Point1.x = point[1].x;
                           Point1.y = point[1].y + ROI_rect_src.y;
                           cvLine(pImgFrame,Point0,Point1,CV_RGB(255,0,0),2,CV_AA,0);
                   }  
               
           }
           cvShowImage(&quot;Source Video&quot;, pImgFrame);        
           cvShowImage(&quot;Destination Video&quot;, pImgEdge);        
         
        QueryPerformanceCounter(&freq);
        QPart2 = freq.QuadPart;
        dfMinus = (double)(QPart2 - QPart1);
                dfTim = 1000 * dfMinus / dfFreq;
                printf(&quot;The current image processing takes %.2f ms\n&quot;,dfTim);

                cvWaitKey(100);
        }

        cvReleaseCapture( &capture );
        cvReleaseImage(&pImgGray);
        cvReleaseImage(&pImgSmooth);
        cvReleaseImage(&pImgEdge);
       
        cvDestroyWindow(&quot;Source Video&quot;);
        cvDestroyWindow(&quot;Destionation Video&quot;);
        return 0;
这是一个车道线检测程序,但是通过霍夫变换,会检测出很多除车道线意外的其他不需要的直线,怎样修改程序把这些多余的线段去掉?并把车道线标记出来。
}
回复

使用道具 举报

发表于 2011-9-28 13:37:27 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

第一个图,可以用sobel自己取边缘,
就能通过梯度值的正负号剔除外侧这道线了
楼主参考
回复 支持 反对

使用道具 举报

发表于 2011-9-29 15:33:04 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-9-29 16:46:03 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

[quote][/quote]
请问这位大哥能把代码贴下吗?不胜感激~
回复 支持 反对

使用道具 举报

发表于 2011-9-29 21:06:07 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

[quote=&quot;ivych1000&quot;:4wckjlv6]
请问这位大哥能把代码贴下吗?不胜感激~[/quote:4wckjlv6]
这个属于实验室机密,老板交代了,代码不能外传,不好意思
回复 支持 反对

使用道具 举报

发表于 2011-9-29 21:42:41 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

再给个例子你看一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-9-30 09:35:14 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

再给个例子你看一下吧
这位大哥。。。 帮帮忙,我只是个学生,对你们构不成威胁的。。。 你这样让我看得见摸不着,很蛋疼的。。。能不能偷偷滴发给我看看啊    邮箱f47xialongjiang@vip.qq.com
回复 支持 反对

使用道具 举报

发表于 2011-9-30 12:58:10 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

同是学生啊,但是我们老板再三强调过实验室的保密规则,老板要赚钱,没办法啊,其实很简单,我也只做了两个月,这只是项目的一个小模块而已,这个小模块大概不到一个月,看我的demo你应该有启示的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-9-30 14:13:16 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

同是学生啊,但是我们老板再三强调过实验室的保密规则,老板要赚钱,没办法啊,其实很简单,我也只做了两个月,这只是项目的一个小模块而已,这个小模块大概不到一个月,看我的demo你应该有启示的。
我才做了几天。。。 卡在这动不了了。。 唉。
回复 支持 反对

使用道具 举报

发表于 2011-10-25 10:49:38 | 显示全部楼层

怎样在车道线检测中去除多余的线段,求各位大神帮帮忙

共享一下这部分的源代码,你不妨做一个简单的demo程序贴出来,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-25 21:52 , Processed in 0.012171 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表