#include <iostream>
#include <ctype.h>
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;
}
std::swap(points[1], points[0]);
}
return 0;
}
Designed for command line parsing.
Definition utility.hpp:820
n-dimensional dense array class
Definition mat.hpp:812
void copyTo(OutputArray m) const
Copies the matrix to another one.
bool empty() const
Returns true if the array has no elements.
static Scalar_< double > all(double v0)
The class defining termination criteria for iterative algorithms.
Definition types.hpp:886
@ EPS
the desired accuracy or change in parameters at which the iterative algorithm stops
Definition types.hpp:895
@ COUNT
the maximum number of iterations or elements to compute
Definition types.hpp:893
Class for video capturing from video files, image sequences or cameras.
Definition videoio.hpp:731
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.
virtual bool isOpened() const
Returns true if video capturing has been initialized already.
#define CV_VERSION
Definition version.hpp:19
double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
Calculates the absolute norm of an array.
Size2i Size
Definition types.hpp:370
Scalar_< double > Scalar
Definition types.hpp:702
Point_< float > Point2f
Definition types.hpp:207
void swap(Mat &a, Mat &b)
Swaps two matrices.
@ EVENT_LBUTTONDOWN
indicates that the left mouse button is pressed.
Definition highgui.hpp:168
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
void setMouseCallback(const String &winname, MouseCallback onMouse, void *userdata=0)
Sets mouse handler for the specified window.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
Converts an image from one color space to another.
@ COLOR_BGR2GRAY
convert between RGB/BGR and grayscale, color conversions
Definition imgproc.hpp:555
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
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.
void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria)
Refines the corner locations.
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...
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
GOpaque< Size > size(const GMat &src)
Gets dimensions from Mat.
"black box" representation of the file storage associated with a file on disk.
Definition core.hpp:102