While researching about various trackers in my hexapod project I came across a very simple python code that was tracking on the basis of movements. But it was based on old Matlab API. So I wanted to implement it in OpenCV. Tracking any object in a video is a very important part in the field of Robotics. For eg. suppose you want to track moving vehicles at traffic signals(Project Transpose,IIM Ahmedabad), track moving obstacles for an autonomous robot( Project Hexapod,Bits Pilani KK Birla Goa Campus), finding life existence in unmanned areas, etc.
You can download the code from here: https://github.com/abhi-kumar/OPENCV_MISC/blob/master/track_motion.cpp
Lets go through the major snippets of the code.
#include <stdio.h> #include <cv.h> #include <highgui.h>
These are the libraries for the old C based OpenCV modules
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/video/tracking.hpp"
These are the libraries for the new C++ based OpenCV modules
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>
The standard C++ libraries
float MHI_DURATION = 0.05; int DEFAULT_THRESHOLD = 32; float MAX_TIME_DELTA = 12500.0; float MIN_TIME_DELTA = 5; int visual_trackbar = 2;
These are the parameters to be used in the tracking function. Please note that they may change according to the type of camera being used.
1.Timestamp– Current time in milliseconds or other units.
2.MHI_DURATION-Maximal duration of the motion track in the same units as timestamp
3.DELTA_TIME-Minimal (or maximal) allowed difference between mhi values within a pixel neighborhood.
updateMotionHistory(motion_mask,motion_history,timestamp,MHI_DURATION); calcMotionGradient(motion_history, mg_mask, mg_orient, 5, 12500.0, 3); segmentMotion(motion_history, seg_mask, seg_bounds, timestamp, 32);
To understand these three major lines you must go through these links
Now the compilation and running the application in ubuntu
1.Download the code
2.Open a terminal an traverse to the folder containing the code
(Assuming you named the code file as “track_motion.cpp”)
a)chmod +x track_motion.cpp
b)g++ -ggdb `pkg-config –cflags opencv` -o `basename track_motion.cpp .cpp` track_motion.cpp `pkg-config –libs opencv`
The default trackbar will be set to binary view, any motion detected will be tracked in white color. Changing the trackbar position to number “1” will provide a grayscale view and in the same way number “0” is RGB and number “3” is in HSV.
Here is a demo video link to get an overview of the different views of the application:
I hope you benefit from this code.
Thank you 🙂