RLPark 1.0.0
Reinforcement Learning Framework in Java
|
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 }