RLPark 1.0.0
Reinforcement Learning Framework in Java

OpticalFlowTracker.java

Go to the documentation of this file.
00001 package rlpark.plugin.opencv.samples;
00002 
00003 /*
00004  * Because I believe that examples are the easiest way how to use JavaCV, I am 
00005  * sending a sample based on http://dasl.mem.drexel.edu/~noahKuntz/openCVTut9.html
00006  *
00007  * burgetrm@gmail.com
00008  */
00009 
00010 import static com.googlecode.javacv.cpp.opencv_core.CV_RGB;
00011 import static com.googlecode.javacv.cpp.opencv_core.CV_TERMCRIT_EPS;
00012 import static com.googlecode.javacv.cpp.opencv_core.CV_TERMCRIT_ITER;
00013 import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_32F;
00014 import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage;
00015 import static com.googlecode.javacv.cpp.opencv_core.cvGetSize;
00016 import static com.googlecode.javacv.cpp.opencv_core.cvLine;
00017 import static com.googlecode.javacv.cpp.opencv_core.cvPoint;
00018 import static com.googlecode.javacv.cpp.opencv_core.cvSize;
00019 import static com.googlecode.javacv.cpp.opencv_core.cvTermCriteria;
00020 import static com.googlecode.javacv.cpp.opencv_highgui.CV_LOAD_IMAGE_GRAYSCALE;
00021 import static com.googlecode.javacv.cpp.opencv_highgui.CV_LOAD_IMAGE_UNCHANGED;
00022 import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
00023 import static com.googlecode.javacv.cpp.opencv_highgui.cvNamedWindow;
00024 import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;
00025 import static com.googlecode.javacv.cpp.opencv_highgui.cvShowImage;
00026 import static com.googlecode.javacv.cpp.opencv_highgui.cvWaitKey;
00027 import static com.googlecode.javacv.cpp.opencv_imgproc.cvFindCornerSubPix;
00028 import static com.googlecode.javacv.cpp.opencv_imgproc.cvGoodFeaturesToTrack;
00029 import static com.googlecode.javacv.cpp.opencv_video.cvCalcOpticalFlowPyrLK;
00030 
00031 import com.googlecode.javacv.cpp.opencv_core.CvArr;
00032 import com.googlecode.javacv.cpp.opencv_core.CvPoint;
00033 import com.googlecode.javacv.cpp.opencv_core.CvPoint2D32f;
00034 import com.googlecode.javacv.cpp.opencv_core.CvSize;
00035 import com.googlecode.javacv.cpp.opencv_core.IplImage;
00036 
00037 public class OpticalFlowTracker {
00038     private static final int MAX_CORNERS = 500;
00039 
00040     public static void main(String[] args) {
00041         // Load two images and allocate other structures
00042         IplImage imgA = cvLoadImage(
00043                 "image0.png",
00044                 CV_LOAD_IMAGE_GRAYSCALE);
00045         IplImage imgB = cvLoadImage(
00046                 "image1.png",
00047                 CV_LOAD_IMAGE_GRAYSCALE);
00048 
00049         CvSize img_sz = cvGetSize(imgA);
00050         int win_size = 15;
00051 
00052         // IplImage imgC = cvLoadImage("OpticalFlow1.png",
00053         // CV_LOAD_IMAGE_UNCHANGED);
00054         IplImage imgC = cvLoadImage(
00055                 "image0.png",
00056                 CV_LOAD_IMAGE_UNCHANGED);
00057         // Get the features for tracking
00058         IplImage eig_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1);
00059         IplImage tmp_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1);
00060 
00061         int[] corner_count = { MAX_CORNERS };
00062         CvPoint2D32f cornersA = new CvPoint2D32f(MAX_CORNERS);
00063 
00064         CvArr mask = null;
00065         cvGoodFeaturesToTrack(imgA, eig_image, tmp_image, cornersA,
00066                 corner_count, 0.05, 5.0, mask, 3, 0, 0.04);
00067 
00068         cvFindCornerSubPix(imgA, cornersA, corner_count[0],
00069                 cvSize(win_size, win_size), cvSize(-1, -1),
00070                 cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
00071 
00072         // Call Lucas Kanade algorithm
00073         byte[] features_found = new byte[MAX_CORNERS];
00074         float[] feature_errors = new float[MAX_CORNERS];
00075 
00076         CvSize pyr_sz = cvSize(imgA.width() + 8, imgB.height() / 3);
00077 
00078         IplImage pyrA = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1);
00079         IplImage pyrB = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1);
00080 
00081         CvPoint2D32f cornersB = new CvPoint2D32f(MAX_CORNERS);
00082         cvCalcOpticalFlowPyrLK(imgA, imgB, pyrA, pyrB, cornersA, cornersB,
00083                 corner_count[0], cvSize(win_size, win_size), 5,
00084                 features_found, feature_errors,
00085                 cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.3), 0);
00086 
00087         // Make an image of the results
00088         for (int i = 0; i < corner_count[0]; i++) {
00089             if (features_found[i] == 0 || feature_errors[i] > 550) {
00090                 System.out.println("Error is " + feature_errors[i] + "/n");
00091                 continue;
00092             }
00093             System.out.println("Got it/n");
00094             cornersA.position(i);
00095             cornersB.position(i);
00096             CvPoint p0 = cvPoint(Math.round(cornersA.x()),
00097                     Math.round(cornersA.y()));
00098             CvPoint p1 = cvPoint(Math.round(cornersB.x()),
00099                     Math.round(cornersB.y()));
00100             cvLine(imgC, p0, p1, CV_RGB(255, 0, 0), 
00101                     2, 8, 0);
00102         }
00103 
00104         cvSaveImage(
00105                 "image0-1.png",
00106                 imgC);
00107         cvNamedWindow( "LKpyr_OpticalFlow", 0 );
00108         cvShowImage( "LKpyr_OpticalFlow", imgC );
00109         cvWaitKey(0);
00110     }
00111 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark