From d5d897b7cbe2cc701106b43cd6705558a79fbf44 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 2 Aug 2011 10:58:26 +0000 Subject: [PATCH] Java API: added support for read/write functions in features2d --- .../src/org/opencv/test/OpenCVTestRunner.java | 41 +----- .../test/features2d/features2dTest.java | 2 - modules/java/gen_javadoc.py | 10 +- modules/java/src/cpp/features2d_manual.hpp | 123 +++++++++++------- modules/java/src/java/Android.java | 82 +++++++++--- modules/java/src/java/core+CvException.java | 2 +- 6 files changed, 156 insertions(+), 104 deletions(-) diff --git a/modules/java/android_test/src/org/opencv/test/OpenCVTestRunner.java b/modules/java/android_test/src/org/opencv/test/OpenCVTestRunner.java index 9249ac36dc..16eea3cb1d 100644 --- a/modules/java/android_test/src/org/opencv/test/OpenCVTestRunner.java +++ b/modules/java/android_test/src/org/opencv/test/OpenCVTestRunner.java @@ -5,10 +5,7 @@ import android.test.AndroidTestRunner; import android.test.InstrumentationTestRunner; import android.util.Log; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; +import org.opencv.Android; /** * This only class is Android specific. The original idea about test order @@ -22,6 +19,7 @@ public class OpenCVTestRunner extends InstrumentationTestRunner { public static String LENA_PATH; public static String CHESS_PATH; public static String LBPCASCADE_FRONTALFACE_PATH; + public static Context context; private AndroidTestRunner androidTestRunner; private static String TAG = "opencv_test_java"; @@ -32,9 +30,10 @@ public class OpenCVTestRunner extends InstrumentationTestRunner { @Override public void onStart() { - LENA_PATH = ExportResource(R.drawable.lena); - CHESS_PATH = ExportResource(R.drawable.chessboard); - LBPCASCADE_FRONTALFACE_PATH = ExportResource(R.raw.lbpcascade_frontalface); + context = getContext(); + LENA_PATH = Android.ExportResource(context, R.drawable.lena); + CHESS_PATH = Android.ExportResource(context, R.drawable.chessboard); + LBPCASCADE_FRONTALFACE_PATH = Android.ExportResource(context, R.raw.lbpcascade_frontalface); // List testCases = androidTestRunner.getTestCases(); // Collections.shuffle(testCases); //shuffle the tests order @@ -47,32 +46,4 @@ public class OpenCVTestRunner extends InstrumentationTestRunner { androidTestRunner = super.getAndroidTestRunner(); return androidTestRunner; } - - private String ExportResource(int resourceId) { - String fullname = getContext().getResources().getString(resourceId); - String resName = fullname.substring(fullname.lastIndexOf("/") + 1); - try { - InputStream is = getContext().getResources().openRawResource( - resourceId); - File resDir = getContext().getDir("testdata", Context.MODE_PRIVATE); - File resFile = new File(resDir, resName); - - FileOutputStream os = new FileOutputStream(resFile); - - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = is.read(buffer)) != -1) { - os.write(buffer, 0, bytesRead); - } - is.close(); - os.close(); - - return resFile.getAbsolutePath(); - } catch (IOException e) { - e.printStackTrace(); - Log("Failed to export resource " + resName + ". Exception thrown: " - + e); - } - return null; - } } diff --git a/modules/java/android_test/src/org/opencv/test/features2d/features2dTest.java b/modules/java/android_test/src/org/opencv/test/features2d/features2dTest.java index b3b59edbb4..33a3cafc48 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/features2dTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/features2dTest.java @@ -2,7 +2,5 @@ package org.opencv.test.features2d; import org.opencv.test.OpenCVTestCase; - public class features2dTest extends OpenCVTestCase { - } diff --git a/modules/java/gen_javadoc.py b/modules/java/gen_javadoc.py index 414be42fa4..96bc14f829 100644 --- a/modules/java/gen_javadoc.py +++ b/modules/java/gen_javadoc.py @@ -22,8 +22,14 @@ class JavadocGenerator(object): assert args_start * args_end > 0 if args_start >= 0: assert args_start < args_end - return (line[:args_start].strip(), offset, filter(None, list(arg.strip() for arg in line[args_start+1:args_end].split(",")))) - return (line, offset, []) + name = line[:args_start].strip() + if name.startswith("java"): + name = name[4:] + return (name, offset, filter(None, list(arg.strip() for arg in line[args_start+1:args_end].split(",")))) + name = line.strip() + if name.startswith("java"): + name = name[4:] + return (name, offset, []) def document(self, infile, outfile): inf = open(infile, "rt") diff --git a/modules/java/src/cpp/features2d_manual.hpp b/modules/java/src/cpp/features2d_manual.hpp index 47b7c4d23e..044a7aa59f 100644 --- a/modules/java/src/cpp/features2d_manual.hpp +++ b/modules/java/src/cpp/features2d_manual.hpp @@ -12,19 +12,31 @@ public: #if 0 CV_WRAP void detect( const Mat& image, vector& keypoints, const Mat& mask=Mat() ) const; CV_WRAP void detect( const vector& images, vector >& keypoints, const vector& masks=vector() ) const; - CV_WRAP virtual void read( const FileNode& ); - CV_WRAP virtual void write( FileStorage& ) const; CV_WRAP virtual bool empty() const; #endif - //supported: FAST STAR SIFT SURF ORB MSER GFTT HARRIS Grid(XXXX) Pyramid(XXXX) Dynamic(XXXX) - //not supported: SimpleBlob, Dense - CV_WRAP_AS(create) static javaFeatureDetector* jcreate( const string& detectorType ) - { - Ptr detector = FeatureDetector::create(detectorType); - detector.addref(); - return (javaFeatureDetector*)((FeatureDetector*) detector); - } + //supported: FAST STAR SIFT SURF ORB MSER GFTT HARRIS Grid(XXXX) Pyramid(XXXX) Dynamic(XXXX) + //not supported: SimpleBlob, Dense + CV_WRAP_AS(create) static javaFeatureDetector* jcreate( const string& detectorType ) + { + Ptr detector = FeatureDetector::create(detectorType); + detector.addref(); + return (javaFeatureDetector*)((FeatureDetector*) detector); + } + + CV_WRAP void write( const string& fileName ) const + { + FileStorage fs(fileName, FileStorage::WRITE); + ((FeatureDetector*)this)->write(fs); + fs.release(); + } + + CV_WRAP void read( const string& fileName ) + { + FileStorage fs(fileName, FileStorage::READ); + ((FeatureDetector*)this)->read(fs.root()); + fs.release(); + } }; class CV_EXPORTS_AS(DescriptorMatcher) javaDescriptorMatcher : public DescriptorMatcher @@ -32,14 +44,14 @@ class CV_EXPORTS_AS(DescriptorMatcher) javaDescriptorMatcher : public Descriptor public: #if 0 CV_WRAP virtual bool isMaskSupported() const; - CV_WRAP virtual void add( const vector& descriptors ); - CV_WRAP const vector& getTrainDescriptors() const; - CV_WRAP virtual void clear(); - CV_WRAP virtual bool empty() const; - CV_WRAP virtual void train(); - CV_WRAP void match( const Mat& queryDescriptors, const Mat& trainDescriptors, + CV_WRAP virtual void add( const vector& descriptors ); + CV_WRAP const vector& getTrainDescriptors() const; + CV_WRAP virtual void clear(); + CV_WRAP virtual bool empty() const; + CV_WRAP virtual void train(); + CV_WRAP void match( const Mat& queryDescriptors, const Mat& trainDescriptors, vector& matches, const Mat& mask=Mat() ) const; - CV_WRAP void knnMatch( const Mat& queryDescriptors, const Mat& trainDescriptors, + CV_WRAP void knnMatch( const Mat& queryDescriptors, const Mat& trainDescriptors, vector >& matches, int k, const Mat& mask=Mat(), bool compactResult=false ) const; CV_WRAP void radiusMatch( const Mat& queryDescriptors, const Mat& trainDescriptors, @@ -51,25 +63,36 @@ public: const vector& masks=vector(), bool compactResult=false ); CV_WRAP void radiusMatch( const Mat& queryDescriptors, vector >& matches, float maxDistance, const vector& masks=vector(), bool compactResult=false ); - CV_WRAP virtual void read( const FileNode& ); - // Writes matcher object to a file storage - CV_WRAP virtual void write( FileStorage& ) const; #endif CV_WRAP_AS(clone) javaDescriptorMatcher* jclone( bool emptyTrainData=false ) const - { - Ptr matcher = this->clone(emptyTrainData); - matcher.addref(); - return (javaDescriptorMatcher*)((DescriptorMatcher*) matcher); - } - - //supported: FlannBased, BruteForce, BruteForce-L1, BruteForce-Hamming, BruteForce-HammingLUT - CV_WRAP_AS(create) static javaDescriptorMatcher* jcreate( const string& descriptorMatcherType ) - { - Ptr matcher = DescriptorMatcher::create(descriptorMatcherType); - matcher.addref(); - return (javaDescriptorMatcher*)((DescriptorMatcher*) matcher); - } + { + Ptr matcher = this->clone(emptyTrainData); + matcher.addref(); + return (javaDescriptorMatcher*)((DescriptorMatcher*) matcher); + } + + //supported: FlannBased, BruteForce, BruteForce-L1, BruteForce-Hamming, BruteForce-HammingLUT + CV_WRAP_AS(create) static javaDescriptorMatcher* jcreate( const string& descriptorMatcherType ) + { + Ptr matcher = DescriptorMatcher::create(descriptorMatcherType); + matcher.addref(); + return (javaDescriptorMatcher*)((DescriptorMatcher*) matcher); + } + + CV_WRAP void write( const string& fileName ) const + { + FileStorage fs(fileName, FileStorage::WRITE); + ((DescriptorMatcher*)this)->write(fs); + fs.release(); + } + + CV_WRAP void read( const string& fileName ) + { + FileStorage fs(fileName, FileStorage::READ); + ((DescriptorMatcher*)this)->read(fs.root()); + fs.release(); + } }; class CV_EXPORTS_AS(DescriptorExtractor) javaDescriptorExtractor : public DescriptorExtractor @@ -78,8 +101,6 @@ public: #if 0 CV_WRAP void compute( const Mat& image, vector& keypoints, Mat& descriptors ) const; CV_WRAP void compute( const vector& images, vector >& keypoints, vector& descriptors ) const; - CV_WRAP virtual void read( const FileNode& ); - CV_WRAP virtual void write( FileStorage& ) const; CV_WRAP virtual int descriptorSize() const = 0; CV_WRAP virtual int descriptorType() const = 0; @@ -87,13 +108,27 @@ public: #endif //supported SIFT, SURF, ORB, BRIEF, Opponent(XXXX) - //not supported: Calonder - CV_WRAP_AS(create) static javaDescriptorExtractor* jcreate( const string& descriptorExtractorType ) - { - Ptr extractor = DescriptorExtractor::create(descriptorExtractorType); - extractor.addref(); - return (javaDescriptorExtractor*)((DescriptorExtractor*) extractor); - } + //not supported: Calonder + CV_WRAP_AS(create) static javaDescriptorExtractor* jcreate( const string& descriptorExtractorType ) + { + Ptr extractor = DescriptorExtractor::create(descriptorExtractorType); + extractor.addref(); + return (javaDescriptorExtractor*)((DescriptorExtractor*) extractor); + } + + CV_WRAP void write( const string& fileName ) const + { + FileStorage fs(fileName, FileStorage::WRITE); + ((DescriptorExtractor*)this)->write(fs); + fs.release(); + } + + CV_WRAP void read( const string& fileName ) + { + FileStorage fs(fileName, FileStorage::READ); + ((DescriptorExtractor*)this)->read(fs.root()); + fs.release(); + } }; #if 0 @@ -122,9 +157,9 @@ CV_EXPORTS_W void drawMatches( const Mat& img1, const vector& keypoint const vector >& matches1to2, Mat& outImg, const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), const vector >& matchesMask=vector >(), int flags=0); - + #endif } //cv -#endif // __OPENCV_FEATURES_2D_MANUAL_HPP__ \ No newline at end of file +#endif // __OPENCV_FEATURES_2D_MANUAL_HPP__ diff --git a/modules/java/src/java/Android.java b/modules/java/src/java/Android.java index 95e1fc6f77..46ffffc635 100644 --- a/modules/java/src/java/Android.java +++ b/modules/java/src/java/Android.java @@ -1,20 +1,62 @@ -package org.opencv; - -import org.opencv.core.Mat; -import android.graphics.Bitmap; - -public class Android { - - public static Mat BitmapToMat(Bitmap b) { - return new Mat( nBitmapToMat(b) ); - } - - public static boolean MatToBitmap(Mat m, Bitmap b) { - return nMatToBitmap(m.nativeObj, b); - } - - // native stuff - static { System.loadLibrary("opencv_java"); } - private static native long nBitmapToMat(Bitmap b); - private static native boolean nMatToBitmap(long m, Bitmap b); -} +package org.opencv; + +import org.opencv.core.CvException; +import org.opencv.core.Mat; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import android.content.Context; +import android.graphics.Bitmap; + +public class Android { + + public static String ExportResource(Context context, int resourceId) { + return ExportResource(context, resourceId, "OpenCV_data"); + } + + public static String ExportResource(Context context, int resourceId, String dirname) { + String fullname = context.getResources().getString(resourceId); + String resName = fullname.substring(fullname.lastIndexOf("/") + 1); + try { + InputStream is = context.getResources().openRawResource(resourceId); + File resDir = context.getDir(dirname, Context.MODE_PRIVATE); + File resFile = new File(resDir, resName); + + FileOutputStream os = new FileOutputStream(resFile); + + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = is.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + is.close(); + os.close(); + + return resFile.getAbsolutePath(); + } catch (IOException e) { + e.printStackTrace(); + throw new CvException("Failed to export resource " + resName + + ". Exception thrown: " + e); + } + } + + public static Mat BitmapToMat(Bitmap b) { + return new Mat(nBitmapToMat(b)); + } + + public static boolean MatToBitmap(Mat m, Bitmap b) { + return nMatToBitmap(m.nativeObj, b); + } + + // native stuff + static { + System.loadLibrary("opencv_java"); + } + + private static native long nBitmapToMat(Bitmap b); + + private static native boolean nMatToBitmap(long m, Bitmap b); +} diff --git a/modules/java/src/java/core+CvException.java b/modules/java/src/java/core+CvException.java index 1ad0e3adfc..161523fa5e 100644 --- a/modules/java/src/java/core+CvException.java +++ b/modules/java/src/java/core+CvException.java @@ -1,6 +1,6 @@ package org.opencv.core; -public class CvException extends Exception { +public class CvException extends RuntimeException { private static final long serialVersionUID = 1L;