 |
OpenCV
4.5.2
Open Source Computer Vision
|
An example using the Lucas-Kanade optical flow algorithm
#include <iostream>
#include <ctype.h>
using namespace std;
static void help()
{
cout << "\nThis is a demo of Lukas-Kanade optical flow lkdemo(),\n"
cout << "\nIt uses camera by default, but you can provide a path to video as an argument.\n";
cout << "\nHot keys: \n"
"\tESC - quit the program\n"
"\tr - auto-initialize tracking\n"
"\tc - delete all the points\n"
"\tn - switch the \"night\" mode on/off\n"
"To add/remove a feature point click it\n" << endl;
}
bool addRemovePt = false;
static void onMouse( int event, int x, int y, int , void* )
{
{
point =
Point2f((
float)x, (
float)y);
addRemovePt = true;
}
}
int main( int argc, char** argv )
{
Size subPixWinSize(10,10), winSize(31,31);
const int MAX_COUNT = 500;
bool needToInit = false;
bool nightMode = false;
help();
string input = parser.get<string>("@input");
if( input.size() == 1 && isdigit(input[0]) )
cap.
open(input[0] -
'0');
else
{
cout << "Could not initialize capturing...\n";
return 0;
}
Mat gray, prevGray, image, frame;
vector<Point2f> points[2];
for(;;)
{
cap >> frame;
if( frame.empty() )
break;
if( nightMode )
if( needToInit )
{
addRemovePt = false;
}
else if( !points[0].empty() )
{
vector<uchar> status;
vector<float> err;
3, termcrit, 0, 0.001);
size_t i, k;
for( i = k = 0; i < points[1].size(); i++ )
{
if( addRemovePt )
{
if(
norm(point - points[1][i]) <= 5 )
{
addRemovePt = false;
continue;
}
}
if( !status[i] )
continue;
points[1][k++] = points[1][i];
}
points[1].resize(k);
}
if( addRemovePt && points[1].
size() < (
size_t)MAX_COUNT )
{
vector<Point2f> tmp;
tmp.push_back(point);
points[1].push_back(tmp[0]);
addRemovePt = false;
}
needToInit = false;
if( c == 27 )
break;
switch( c )
{
case 'r':
needToInit = true;
break;
case 'c':
points[0].clear();
points[1].clear();
break;
case 'n':
nightMode = !nightMode;
break;
}
}
return 0;
}
static Scalar_< double > all(double v0)
returns a scalar with all elements set to v0
The class defining termination criteria for iterative algorithms.
Definition: types.hpp:852
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
Converts an image from one color space to another.
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04)
Determines strong corners on an image.
Point_< float > Point2f
Definition: types.hpp:192
void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria)
Refines the corner locations.
Class for video capturing from video files, image sequences or cameras.
Definition: videoio.hpp:664
int waitKey(int delay=0)
Waits for a pressed key.
@ COUNT
the maximum number of iterations or elements to compute
Definition: types.hpp:860
@ EVENT_LBUTTONDOWN
indicates that the left mouse button is pressed.
Definition: highgui.hpp:212
#define CV_VERSION
Definition: version.hpp:19
@ EPS
the desired accuracy or change in parameters at which the iterative algorithm stops
Definition: types.hpp:862
Template class for specifying the size of an image or rectangle.
Definition: types.hpp:315
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
static double norm(const Matx< _Tp, m, n > &M)
Size2i Size
Definition: types.hpp:347
bool empty() const
Returns true if the array has no elements.
void swap(Mat &a, Mat &b)
Swaps two matrices.
virtual bool isOpened() const
Returns true if video capturing has been initialized already.
GOpaque< Size > size(const GMat &src)
Gets dimensions from Mat.
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
Scalar_< double > Scalar
Definition: types.hpp:669
void setMouseCallback(const String &winname, MouseCallback onMouse, void *userdata=0)
Sets mouse handler for the specified window.
n-dimensional dense array class
Definition: mat.hpp:801
void copyTo(OutputArray m) const
Copies the matrix to another one.
Designed for command line parsing.
Definition: utility.hpp:799
@ COLOR_BGR2GRAY
convert between RGB/BGR and grayscale, color conversions
Definition: imgproc.hpp:551
"black box" representation of the file storage associated with a file on disk.
Definition: affine.hpp:51
void calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(21, 21), int maxLevel=3, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags=0, double minEigThreshold=1e-4)
Calculates an optical flow for a sparse feature set using the iterative Lucas-Kanade method with pyra...
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
Opens a video file or a capturing device or an IP video stream for video capturing.