/* * Because I believe that examples are the easiest way how to use JavaCV, I am * sending a sample based on http://dasl.mem.drexel.edu/~noahKuntz/openCVTut9.html * * burgetrm@gmail.com */ import org.bytedeco.javacpp.BytePointer; import org.bytedeco.javacpp.FloatPointer; import org.bytedeco.javacpp.IntPointer; import org.bytedeco.javacpp.Loader; import org.bytedeco.javacv.*; import static org.bytedeco.javacpp.opencv_core.*; import static org.bytedeco.javacpp.opencv_imgproc.*; import static org.bytedeco.javacpp.opencv_video.*; import static org.bytedeco.javacpp.opencv_highgui.*; import static org.bytedeco.javacpp.opencv_imgcodecs.*; public class OpticalFlowTracker { private static final int MAX_CORNERS = 500; public static void main(String[] args) { // Load two images and allocate other structures IplImage imgA = cvLoadImage( "image0.png", CV_LOAD_IMAGE_GRAYSCALE); IplImage imgB = cvLoadImage( "image1.png", CV_LOAD_IMAGE_GRAYSCALE); CvSize img_sz = cvGetSize(imgA); int win_size = 15; // IplImage imgC = cvLoadImage("OpticalFlow1.png", // CV_LOAD_IMAGE_UNCHANGED); IplImage imgC = cvLoadImage( "image0.png", CV_LOAD_IMAGE_UNCHANGED); // Get the features for tracking IplImage eig_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1); IplImage tmp_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1); IntPointer corner_count = new IntPointer(1).put(MAX_CORNERS); CvPoint2D32f cornersA = new CvPoint2D32f(MAX_CORNERS); CvArr mask = null; cvGoodFeaturesToTrack(imgA, eig_image, tmp_image, cornersA, corner_count, 0.05, 5.0, mask, 3, 0, 0.04); cvFindCornerSubPix(imgA, cornersA, corner_count.get(), cvSize(win_size, win_size), cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03)); // Call Lucas Kanade algorithm BytePointer features_found = new BytePointer(MAX_CORNERS); FloatPointer feature_errors = new FloatPointer(MAX_CORNERS); CvSize pyr_sz = cvSize(imgA.width() + 8, imgB.height() / 3); IplImage pyrA = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1); IplImage pyrB = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1); CvPoint2D32f cornersB = new CvPoint2D32f(MAX_CORNERS); cvCalcOpticalFlowPyrLK(imgA, imgB, pyrA, pyrB, cornersA, cornersB, corner_count.get(), cvSize(win_size, win_size), 5, features_found, feature_errors, cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.3), 0); // Make an image of the results for (int i = 0; i < corner_count.get(); i++) { if (features_found.get(i) == 0 || feature_errors.get(i) > 550) { System.out.println("Error is " + feature_errors.get(i) + "/n"); continue; } System.out.println("Got it/n"); cornersA.position(i); cornersB.position(i); CvPoint p0 = cvPoint(Math.round(cornersA.x()), Math.round(cornersA.y())); CvPoint p1 = cvPoint(Math.round(cornersB.x()), Math.round(cornersB.y())); cvLine(imgC, p0, p1, CV_RGB(255, 0, 0), 2, 8, 0); } cvSaveImage( "image0-1.png", imgC); cvNamedWindow( "LKpyr_OpticalFlow", 0 ); cvShowImage( "LKpyr_OpticalFlow", imgC ); cvWaitKey(0); } }