#include #include #include #include #include #include using namespace cv; using namespace std; int main(int argc, char **argv) { const string about = "This sample demonstrates Lucas-Kanade Optical Flow calculation.\n" "The example file can be downloaded from:\n" " https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4"; const string keys = "{ h help | | print this help message }" "{ @image | vtest.avi | path to image file }"; CommandLineParser parser(argc, argv, keys); parser.about(about); if (parser.has("help")) { parser.printMessage(); return 0; } string filename = samples::findFile(parser.get("@image")); if (!parser.check()) { parser.printErrors(); return 0; } VideoCapture capture(filename); if (!capture.isOpened()){ //error in opening the video input cerr << "Unable to open file!" << endl; return 0; } // Create some random colors vector colors; RNG rng; for(int i = 0; i < 100; i++) { int r = rng.uniform(0, 256); int g = rng.uniform(0, 256); int b = rng.uniform(0, 256); colors.push_back(Scalar(r,g,b)); } Mat old_frame, old_gray; vector p0, p1; // Take first frame and find corners in it capture >> old_frame; cvtColor(old_frame, old_gray, COLOR_BGR2GRAY); goodFeaturesToTrack(old_gray, p0, 100, 0.3, 7, Mat(), 7, false, 0.04); // Create a mask image for drawing purposes Mat mask = Mat::zeros(old_frame.size(), old_frame.type()); while(true){ Mat frame, frame_gray; capture >> frame; if (frame.empty()) break; cvtColor(frame, frame_gray, COLOR_BGR2GRAY); // calculate optical flow vector status; vector err; TermCriteria criteria = TermCriteria((TermCriteria::COUNT) + (TermCriteria::EPS), 10, 0.03); calcOpticalFlowPyrLK(old_gray, frame_gray, p0, p1, status, err, Size(15,15), 2, criteria); vector good_new; for(uint i = 0; i < p0.size(); i++) { // Select good points if(status[i] == 1) { good_new.push_back(p1[i]); // draw the tracks line(mask,p1[i], p0[i], colors[i], 2); circle(frame, p1[i], 5, colors[i], -1); } } Mat img; add(frame, mask, img); imshow("Frame", img); int keyboard = waitKey(30); if (keyboard == 'q' || keyboard == 27) break; // Now update the previous frame and previous points old_gray = frame_gray.clone(); p0 = good_new; } }