• Stars
    star
    486
  • Rank 90,527 (Top 2 %)
  • Language
    C++
  • Created over 9 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Vehicle Detection, Tracking and Counting

Vehicle Detection, Tracking and Counting

Last page update: 12/04/2017 (Added Python API & OpenCV 3.x support)

Last version: 1.0.0 (see Release Notes for more info)

Hi everyone,

There are several ways to perform vehicle detection, tracking and counting. Here is a step-by-step of a simplest way to do this:

  1. First, you will need to detect the moving objects. An easy way to do vehicle detection is by using a Background Subtraction (BS) algorithm. You can try to use a background subtraction library like BGSLibrary.
  2. For vehicle tracking, you will need to use a tracking algorithm. A simplest way to do this is by using a blob tracker algorithm (see cvBlob or OpenCVBlobsLib). So, send the foreground mask to cvBlob or OpenCVBlobsLib. For example, the cvBlob library provide some methods to get the centroid, the track and the ID of the moving objects. You can also set to draw a bounding box, the centroid and the angle of the tracked object.
  3. And then, check if the centroid of the moving object has crossed a region of interest (i.e. virtual line) in your video.
  4. Voilà! enjoy it :)

Citation

If you use this code for your publications, please cite it as:

@ONLINE{vdtc,
    author = "Andrews Sobral",
    title  = "Vehicle Detection, Tracking and Counting",
    year   = "2014",
    url    = "https://github.com/andrewssobral/simple_vehicle_counting"
}

For Windows users

  • There is no Visual Studio 2013 template project anymore. Please, use CMAKE instead.

Compiling with OpenCV 3.x and Visual Studio 2015 from CMAKE

Dependencies:

  • OpenCV 3.x (tested with OpenCV 3.2.0)
  • GIT (tested with git version 2.7.2.windows.1).
  • CMAKE for Windows (tested with cmake version 3.1.1).
  • Microsoft Visual Studio (tested with VS2015).

Note: the procedure is similar for OpenCV 2.4.x and Visual Studio 2013.

Please follow the instructions below:

  1. Go to Windows console.

  2. Clone git repository:

git clone --recursive https://github.com/andrewssobral/simple_vehicle_counting.git
  1. Go to simple_vehicle_counting/build folder.

  2. Set your OpenCV PATH:

set OpenCV_DIR=C:\OpenCV3.2.0\build
  1. Launch CMAKE:
cmake -DOpenCV_DIR=%OpenCV_DIR% -G "Visual Studio 14 Win64" ..
  1. Include OpenCV binaries in the system path:
set PATH=%PATH%;%OpenCV_DIR%\x64\vc14\bin
  1. Open the bgs.sln file in your Visual Studio and switch to 'RELEASE' mode

  2. Click on 'ALL_BUILD' project and build!

  3. If everything goes well, copy simple_vehicle_counting.exe to simple_vehicle_counting/ and run!

For Linux users

  • For Linux and Mac users, a CMakefile is provided to compile the source code.

    • Check out the latest project source code and compile it:
~/git clone --recursive https://github.com/andrewssobral/simple_vehicle_counting.git
~/cd simple_vehicle_counting
~/simple_vehicle_counting/cd build
~/simple_vehicle_counting/build/ cmake ..
~/simple_vehicle_counting/build/ make
    • Run demo:
~/simple_vehicle_counting/run_simple_vehicle_counting.sh

Docker image

Example code

#include <iostream>
#include <opencv2/opencv.hpp>

#include "package_bgs/PBAS/PixelBasedAdaptiveSegmenter.h"
#include "package_tracking/BlobTracking.h"
#include "package_analysis/VehicleCouting.h"

int main(int argc, char **argv)
{
  /* Open video file */
  CvCapture *capture = 0;
  capture = cvCaptureFromAVI("dataset/video.avi");
  if(!capture){
    std::cerr << "Cannot open video!" << std::endl;
    return 1;
  }

  /* Background Subtraction Algorithm */
  IBGS *bgs;
  bgs = new PixelBasedAdaptiveSegmenter;

  /* Blob Tracking Algorithm */
  cv::Mat img_blob;
  BlobTracking* blobTracking;
  blobTracking = new BlobTracking;

  /* Vehicle Counting Algorithm */
  VehicleCouting* vehicleCouting;
  vehicleCouting = new VehicleCouting;

  std::cout << "Press 'q' to quit..." << std::endl;
  int key = 0;
  IplImage *frame;
  while(key != 'q')
  {
    frame = cvQueryFrame(capture);
    if(!frame) break;

    cv::Mat img_input = cv::cvarrToMat(frame);
    cv::imshow("Input", img_input);

    // bgs->process(...) internally process and show the foreground mask image
    cv::Mat img_mask;
    bgs->process(img_input, img_mask);

    if(!img_mask.empty())
    {
      // Perform blob tracking
      blobTracking->process(img_input, img_mask, img_blob);

      // Perform vehicle counting
      vehicleCouting->setInput(img_blob);
      vehicleCouting->setTracks(blobTracking->getTracks());
      vehicleCouting->process();
    }

    key = cvWaitKey(1);
  }

  delete vehicleCouting;
  delete blobTracking;
  delete bgs;

  cvDestroyAllWindows();
  cvReleaseCapture(&capture);

  return 0;
}

Python API

A python demo shows how to call the Python API. It is similar as the C++ demo.

To use the Python API, you should copy "python" directory to overwrite the generated one.

~/simple_vehicle_counting/cd build
~/simple_vehicle_counting/build/cmake ..
~/simple_vehicle_counting/build/make -j 8
~/simple_vehicle_counting/build/cp -r ../python/* python/
~/simple_vehicle_counting/build/../run_python_demo.sh

If you have previously built the project at the project root, make sure there are no previously generated libraries in the "python" directory by make clean.

Release Notes:

  • 12/04/2017: Added OpenCV 3.x support. Removed vs2013 template project (use CMAKE instead).

  • 07/04/2017: Added Python API, thanks to @kyu-sz.

  • Version 1.0.0: First version.

More Repositories

1

bgslibrary

A C++ Background Subtraction Library with wrappers for Python, MATLAB, Java and GUI on QT
C++
2,103
star
2

lrslibrary

Low-Rank and Sparse Tools for Background Modeling and Subtraction in Videos
MATLAB
775
star
3

vehicle_detection_haarcascades

Vehicle Detection by Haar Cascades with OpenCV
C++
518
star
4

mctc4bmi

Matrix and Tensor Completion for Background Model Initialization
MATLAB
96
star
5

mtt

MATLAB Tensor Tools
MATLAB
80
star
6

dtt

A C++ header-only for data transfer between linear algebra libraries (Eigen, Armadillo, OpenCV, ArrayFire, LibTorch).
C++
79
star
7

tensor_toolbox

MATLAB Tensor Toolbox (by Tamara Kolda)
MATLAB
35
star
8

imtsl

IMTSL - Incremental and Multi-feature Tensor Subspace Learning
MATLAB
33
star
9

godec

Python implementation of the GoDec algorithm from Zhou and Tao (ICML 2011) for low-rank and sparse representation
Python
32
star
10

ostd

Online Stochastic Tensor Decomposition for Background Subtraction in Multispectral Video Sequences
MATLAB
26
star
11

TDALAB

A MATLAB Toolbox for High-order Tensor Data Decompositions and Analysis
MATLAB
20
star
12

java_motion_detection

Motion Detection with Java + OpenCV + Webcam
Java
15
star
13

llama-webapp

Gradio Web Interface to Interact with LLaMA
Python
12
star
14

YALL1

YALL1: Your ALgorithms for L1
MATLAB
12
star
15

openai-whatsapp

OpenAI + Whatsapp = AI Assistant 🚀
TypeScript
9
star
16

poblano_toolbox

Poblano Toolbox (Sandia National Labs)
MATLAB
6
star
17

nway

N-way Toolbox for MATLAB (by Rasmus Bro)
MATLAB
6
star
18

manopt

A Matlab tool­box for opti­mization on manifolds (by Boumal and Mishra)
MATLAB
5
star
19

deep-learning-pytorch

PyTorch Deep Learning Models
Python
5
star
20

PROPACK

PROPACK toolbox (by Rasmus Larsen)
MATLAB
5
star
21

pyqt-node-editor-example

Python
3
star
22

bgslibrary-examples-cpp

BGS Library Example Projects
C++
3
star
23

andrewssobral.github.io

Andrews Sobral
CSS
3
star
24

redsvd

redsvd - RandomizED Singular Value Decomposition
C++
3
star
25

model_as_a_service

Machine Learning Model as a Service
Jupyter Notebook
2
star
26

docker

Docker files
Dockerfile
2
star
27

rsc

Robust Subspace Clustering algorithms
2
star
28

bgslibrary-examples-python

Python
1
star
29

rpi-raspbian

1
star
30

NVIDIA_Jetson_TX2_cpp

C++
1
star
31

NVIDIA_Jetson_TX2_Python

Python code for NVIDIA Jetson TX2
Python
1
star
32

Heuristic-Optimization-in-Python

Python
1
star
33

python_devops_template

Python DevOps Template
Makefile
1
star