zoukankan      html  css  js  c++  java
  • opencv图像处理5车辆检测

    void CTrafficsampleDlg::OnOK() //读入视频并检测车辆
    {

    // TODO: Add extra validation here

    //此处添加图像处理的代码


    //CDialog::OnOK();
    IplImage *frame = NULL;  //定义帧,每帧就是一张图  
    IplImage *B_part = NULL, *G_part = NULL, *R_part = NULL;
    IplImage *pFrImg = NULL; //前景图片
    IplImage *pBkImg = NULL; //背景图片
    IplImage *dst = NULL;


    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* contour = 0;
     
    //轮廓矩形
    CvRect contourRect = cvRect(0,0,0,0);


    //可以获取视频的各种属性
    CvCapture * pCapture = cvCreateFileCapture("traffic.avi");


    cvNamedWindow("Camera",CV_WINDOW_AUTOSIZE);  //设置窗口  
    cvNamedWindow("temp", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("background",1); 
    cvNamedWindow("foreground",1);
    cvNamedWindow("contours",1);
       
    cvMoveWindow("background", 360, 0); 
    cvMoveWindow("foreground", 690, 0);


    //初始化高斯混合模型参数
    CvGaussBGModel *bg_model=NULL;



    int count = 1;
    while (frame = cvQueryFrame(pCapture))      
    {    
    if(count ==1)
    {
    B_part = cvCreateImage(cvGetSize(frame),frame->depth,1);
    G_part = cvCreateImage(cvGetSize(frame),frame->depth,1);
    R_part = cvCreateImage(cvGetSize(frame),frame->depth,1);
    pBkImg = cvCreateImage(cvSize(frame->width, frame->height),  IPL_DEPTH_8U,3);   
    pFrImg = cvCreateImage(cvSize(frame->width, frame->height),  IPL_DEPTH_8U,1);   
    dst = cvCreateImage( cvGetSize(frame), 8, 3 );//找到轮廓并绘制轮廓
    bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(frame, 0);
    }
    else
    {
    cvUpdateBGStatModel(frame, (CvBGStatModel *)bg_model );//更新高斯背景模型

    //pFrImg为前景图像,只能为单通道
    //pBkImg为背景图像,可以为单通道或与pFrame通道数相同
    cvCopy(bg_model->foreground,pFrImg,0);
    cvCopy(bg_model->background,pBkImg,0);
    //把图像正过来
    pBkImg->origin=1;
    pFrImg->origin=1;
    cvSplit(frame , B_part,G_part, R_part,0);
    cvFlip(B_part,B_part,0);//沿X轴翻转一次


    //下面进行阈值分割
    //如何确定阈值??是否存在编好的函数呢?
    //固定阈值分割方式,会导致一张图片中如果亮暗不均,一张图的不同区域分割效果差距很大
    //如果能够提前提取出图像的背景,然后想减的方式会使分割效果变好
    cvThreshold(B_part,B_part, 195, 255,CV_THRESH_BINARY);


    //阈值分割之后,进行膨胀操作和腐蚀操作
    //默认的模板由于腐蚀和膨胀的幅度比较大,效果不是很好啊
    //最好是自定义模板
    //观察白线大多为竖直的,腐蚀时主要是横向腐蚀
    //车体车头和车身由于在前玻璃的分割作用,数要是在竖向,膨胀时主要在竖向,但是需避免造成两车的太近而融为一体
    IplConvKernel * kenel = cvCreateStructuringElementEx(3,1,1,0,CV_SHAPE_RECT,NULL);
    IplConvKernel * kenel2 = cvCreateStructuringElementEx(1,3,0,1,CV_SHAPE_RECT,NULL);

    cvErode(B_part, B_part,kenel,1 );
    cvDilate(B_part,B_part,kenel,1);
    cvErode(B_part, B_part,kenel2, 1);
    vErode(B_part, B_part,kenel,1 );
      
    cvDilate(B_part,B_part,kenel2,2);
    cvDilate(B_part,B_part,kenel2,2);
    cvDilate(B_part,B_part,NULL,1);


    //获取并绘制轮廓  
    cvFindContours( B_part, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
    cvZero( dst );
    for( ; contour != 0; contour = contour->h_next )
    {


    contourRect = cvBoundingRect(contour,0);


    if((contourRect.width > 10) &&(contourRect.height >12)){
    CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );//每次都随机颜色显示
    /* 用1替代 CV_FILLED  所指示的轮廓外形 */
    cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 );
    //cvRectangle(pFrame,pt3,pt4,CV_RGB(255,0,0),1, 8, 0 );
    cvRectangle(dst ,cvPoint(contourRect.x, contourRect.y),
    cvPoint(contourRect.x + contourRect.width, contourRect.y + contourRect.height),
    CV_RGB(255,0,0),
    1,
    8,
    0);
    }
     
    }
     
     
    cvShowImage("Camera", frame);  
    cvShowImage("temp" ,B_part);
    cvShowImage("background", pBkImg);    
    cvShowImage("foreground", pFrImg);  
    cvShowImage( "contours", dst );


    int key1;
    key1 = cvWaitKey (300);
    if (key1 == 'q' || key1 == 'Q')  
    break;  


    }
    count++;
    }   



        cvDestroyWindow("temp");
    cvReleaseCapture(&pCapture); //销毁摄像头  
    cvDestroyWindow("Camera");  //销毁窗口 
    cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
    cvDestroyWindow("background"); 
    cvDestroyWindow("foreground");  
    cvReleaseImage(&pFrImg); 
    cvReleaseImage(&pBkImg);   
    cvReleaseImage(&dst);
    cvDestroyWindow("contours");
    //CTrafficsampleDlg::OnOK();
    }
  • 相关阅读:
    docker映射端口无法访问
    Tomcat日志分析
    linux服务器性能测试
    mysql库表结构对比工具
    网络基础知识,不懂看这里
    Python之redis、mysql进程守护
    linux文件查找工具
    nginx解决跨域问题
    redis插入单个较大的键值
    linux系统安全巡检脚本
  • 原文地址:https://www.cnblogs.com/libing64/p/2878761.html
Copyright © 2011-2022 走看看