使用OpenCV实现检测和追踪车辆

 更新时间:2018年01月09日 10:50:19   作者:炒鸡嗨客协管徐  
这篇文章主要为大家详细介绍了使用OpenCV实现检测和追踪车辆,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了OpenCV实现检测和追踪车辆的具体代码,供大家参考,具体内容如下

完整源码GitHub

  • 使用高斯混合模型(BackgroundSubtractorMOG2)对背景建模,提取出前景
  • 使用中值滤波去掉椒盐噪声,再闭运算和开运算填充空洞
  • 使用cvBlob库追踪车辆,我稍微修改了cvBlob源码来通过编译

由于要对背景建模,这个方法要求背景是静止的
另外不同车辆白色区域不能连通,否则会认为是同一物体

void processVideo(char* videoFilename) 
{ 
  Mat frame; // current frame 
  Mat fgMaskMOG2; // fg mask fg mask generated by MOG2 method 
  Mat bgImg; // background 
  Ptr<BackgroundSubtractorMOG2> pMOG2 = createBackgroundSubtractorMOG2(200, 36.0, false); // MOG2 Background subtractor 
 
  while (true) 
  { 
    VideoCapture capture(videoFilename); 
    if (!capture.isOpened()) 
    { 
      cerr << "Unable to open video file: " << videoFilename << endl; 
      return; 
    } 
 
    int width = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH); 
    int height = (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT); 
 
    unique_ptr<IplImage, void(*)(IplImage*)> labelImg(cvCreateImage(cvSize(width, height), IPL_DEPTH_LABEL, 1),  
      [](IplImage* p){ cvReleaseImage(&p); }); 
    CvBlobs blobs; 
    CvTracks tracks; 
 
    while (true) 
    { 
      // read input data. ESC or 'q' for quitting 
      int key = waitKey(1); 
      if (key == 'q' || key == 27) 
        return; 
      if (!capture.read(frame)) 
        break; 
 
      // update background 
      pMOG2->apply(frame, fgMaskMOG2); 
      pMOG2->getBackgroundImage(bgImg); 
      imshow("BG", bgImg); 
      imshow("Original mask", fgMaskMOG2); 
 
      // post process 
      medianBlur(fgMaskMOG2, fgMaskMOG2, 5); 
      imshow("medianBlur", fgMaskMOG2); 
      morphologyEx(fgMaskMOG2, fgMaskMOG2, MORPH_CLOSE, getStructuringElement(MORPH_RECT, Size(5, 5))); // fill black holes 
      morphologyEx(fgMaskMOG2, fgMaskMOG2, MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(5, 5))); // fill white holes 
      imshow("morphologyEx", fgMaskMOG2); 
 
      // track 
      cvLabel(&IplImage(fgMaskMOG2), labelImg.get(), blobs); 
      cvFilterByArea(blobs, 64, 10000); 
      cvUpdateTracks(blobs, tracks, 10, 90, 30); 
      cvRenderTracks(tracks, &IplImage(frame), &IplImage(frame)); 
 
      // show 
      imshow("Frame", frame); 
 
      key = waitKey(30); 
    } 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用remalloc的注意事项说明(必看篇)

    使用remalloc的注意事项说明(必看篇)

    下面小编就为大家带来一篇使用remalloc的注意事项说明(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 深入分析Linux下如何对C语言进行编程

    深入分析Linux下如何对C语言进行编程

    本篇文章介绍了,如何在Linux下对C语言进行编程的详细概述。需要的朋友参考下
    2013-05-05
  • Objective-C不带加减号的方法实例

    Objective-C不带加减号的方法实例

    显而易见的事实是,Objective-C 中,+ 表示类方法,- 表示实例方法,这篇文章主要给大家介绍了关于Objective-C不带加减号的相关资料,需要的朋友可以参考下
    2021-06-06
  • C++ 11 nullptr 空指针示例详解

    C++ 11 nullptr 空指针示例详解

    C++11标准引入了nullptr来替代传统的NULL,解决了NULL可能导致的类型混淆问题,nullptr是nullptr_t类型的实例,专用于初始化空类型指针,与整型不会发生隐式转换,从而使代码更健壮,它可以被隐式转换为任意类型的指针,提高了代码的安全性和可读性
    2024-10-10
  • C++使用join拼接字符串的技巧

    C++使用join拼接字符串的技巧

    在C++中,经常需要将多个字符串拼接成一个大字符串,这个过程很容易出错,但有一些技巧可以帮助我们轻松地实现这个目标,五个C++中join字符串的技巧:使用stringstream、使用字符串迭代器、使用字符串的加法运算符、使用std::accumulate函数和使用boost库的join方法
    2023-11-11
  • C++超详细讲解函数对象

    C++超详细讲解函数对象

    在c++中,我们把所有能当作函数使用的对象统称为函数对象。它是实现operator()的任何类型,此运算符被称为调用运算符,当调用此操 作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象
    2022-06-06
  • C语言实践设计开发飞机游戏

    C语言实践设计开发飞机游戏

    飞机大战想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用C语言写一个简单的飞机大战小游戏的相关资料,需要的朋友可以参考下
    2022-02-02
  • C语言代码实现简单三子棋游戏

    C语言代码实现简单三子棋游戏

    这篇文章主要为大家详细介绍了C语言代码实现简单三子棋游戏,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C/C++时间库chrono的使用总结

    C/C++时间库chrono的使用总结

    std::chrono是C++标准库中的一个组件,用于表示和处理时间,其功能就像是心理学中的感知系统,它可以为我们捕捉、量化并操作抽象的时间概念,这就如同我们的大脑可以理解和感知周围环境的时间流逝一样,这种感知和理解能力是人类进行日常活动所必需的,
    2023-12-12
  • 高效实现整型数字转字符串int2str的方法

    高效实现整型数字转字符串int2str的方法

    下面小编就为大家带来一篇高效实现整型数字转字符串int2str的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论