From 78d92584c36e52ad1ec2ebb14cdb8b69f3efae62 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Wed, 4 Apr 2012 12:59:53 +0000 Subject: [PATCH] Java API: changing C++ vector handling; Java tests fixes are expected shortly --- modules/java/gen_java.py | 79 +++++++++++++--------- modules/java/src/cpp/converters.cpp | 33 ++++++--- modules/java/src/cpp/converters.h | 1 + modules/java/src/java/core+CvVector.java | 35 ++++++++++ modules/java/src/java/core+CvVectorByte.java | 42 ++++++++++++ modules/java/src/java/core+CvVectorDMatch.java | 49 ++++++++++++++ modules/java/src/java/core+CvVectorDouble.java | 37 ++++++++++ modules/java/src/java/core+CvVectorFloat.java | 41 +++++++++++ modules/java/src/java/core+CvVectorFloat4.java | 22 ++++++ modules/java/src/java/core+CvVectorFloat6.java | 21 ++++++ modules/java/src/java/core+CvVectorInt.java | 38 +++++++++++ modules/java/src/java/core+CvVectorKeyPoint.java | 53 +++++++++++++++ modules/java/src/java/core+CvVectorPoint.java | 45 ++++++++++++ modules/java/src/java/core+CvVectorPoint2f.java | 45 ++++++++++++ modules/java/src/java/core+CvVectorPoint3.java | 46 +++++++++++++ modules/java/src/java/core+CvVectorPoint3f.java | 46 +++++++++++++ modules/java/src/java/core+CvVectorRect.java | 48 +++++++++++++ modules/java/src/java/utils+Converters.java | 74 ++++++++++++-------- .../src/org/opencv/samples/fd/FdView.java | 8 +-- .../org/opencv/samples/tutorial2/Sample2View.java | 51 ++++++++++++-- 20 files changed, 736 insertions(+), 78 deletions(-) create mode 100644 modules/java/src/java/core+CvVector.java create mode 100644 modules/java/src/java/core+CvVectorByte.java create mode 100644 modules/java/src/java/core+CvVectorDMatch.java create mode 100644 modules/java/src/java/core+CvVectorDouble.java create mode 100644 modules/java/src/java/core+CvVectorFloat.java create mode 100644 modules/java/src/java/core+CvVectorFloat4.java create mode 100644 modules/java/src/java/core+CvVectorFloat6.java create mode 100644 modules/java/src/java/core+CvVectorInt.java create mode 100644 modules/java/src/java/core+CvVectorKeyPoint.java create mode 100644 modules/java/src/java/core+CvVectorPoint.java create mode 100644 modules/java/src/java/core+CvVectorPoint2f.java create mode 100644 modules/java/src/java/core+CvVectorPoint3.java create mode 100644 modules/java/src/java/core+CvVectorPoint3f.java create mode 100644 modules/java/src/java/core+CvVectorRect.java diff --git a/modules/java/gen_java.py b/modules/java/gen_java.py index 89d4c32..79688aa 100644 --- a/modules/java/gen_java.py +++ b/modules/java/gen_java.py @@ -193,34 +193,36 @@ type_dict = { # "complex" : { j_type : "?", jn_args : (("", ""),), jn_name : "", jni_var : "", jni_name : "", "suffix" : "?" }, - "vector_Point" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Point2f" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Point2d" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Point3i" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Point3f" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Point3d" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Point" : { "j_type" : "CvVectorPoint", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Point2f" : { "j_type" : "CvVectorPoint2f", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Point2d" : { "j_type" : "CvVectorPoint2f", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Point3i" : { "j_type" : "CvVectorPoint3", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Point3f" : { "j_type" : "CvVectorPoint3f", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Point3d" : { "j_type" : "CvVectorPoint3f", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_KeyPoint" : { "j_type" : "CvVectorKeyPoint", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_DMatch" : { "j_type" : "CvVectorDMatch", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Rect" : { "j_type" : "CvVectorRect", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_uchar" : { "j_type" : "CvVectorByte", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_char" : { "j_type" : "CvVectorByte", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_int" : { "j_type" : "CvVectorInt", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_float" : { "j_type" : "CvVectorFloat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_double" : { "j_type" : "CvVectorDouble", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Vec4f" : { "j_type" : "CvVectorFloat4", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Vec6f" : { "j_type" : "CvVectorFloat6", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, + "vector_Mat" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_KeyPoint" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_DMatch" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Rect" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_uchar" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_char" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_int" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_float" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_double" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Vec4f" : { "j_type" : "Mat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - "vector_Vec6f" : { "j_type" : "Mat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector %(n)s", "suffix" : "J" }, - - "vector_vector_KeyPoint": { "j_type" : "List>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, - "vector_vector_DMatch" : { "j_type" : "List>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, - "vector_vector_char" : { "j_type" : "List>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, - "vector_vector_Point" : { "j_type" : "List>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, - "vector_vector_Point2f" : { "j_type" : "List>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, + + "vector_vector_KeyPoint": { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, + "vector_vector_DMatch" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, + "vector_vector_char" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, + "vector_vector_Point" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, + "vector_vector_Point2f" : { "j_type" : "List", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector > %(n)s" }, "Mat" : { "j_type" : "Mat", "jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),), "jni_var" : "Mat& %(n)s = *((Mat*)%(n)s_nativeObj)", "jni_type" : "jlong", #"jni_name" : "*%(n)s", "suffix" : "J" }, + "Point" : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y")), "jni_var" : "Point %(n)s((int)%(n)s_x, (int)%(n)s_y)", "jni_type" : "jdoubleArray", "suffix" : "DD"}, @@ -510,7 +512,6 @@ func_arg_fix = { 'boundingRect' : { 'points' : 'vector_Point', }, 'approxPolyDP' : { 'curve' : 'vector_Point2f', 'approxCurve' : 'vector_Point2f', }, 'arcLength' : { 'curve' : 'vector_Point2f', }, - 'isContourConvex' : { 'contour' : 'vector_Point2f', }, 'pointPolygonTest' : { 'contour' : 'vector_Point2f', }, 'minAreaRect' : { 'points' : 'vector_Point2f', }, 'getAffineTransform' : { 'src' : 'vector_Point2f', 'dst' : 'vector_Point2f', }, @@ -519,6 +520,10 @@ func_arg_fix = { 'undistortPoints' : { 'src' : 'vector_Point2d', 'dst' : 'vector_Point2d' }, 'checkRange' : {'pos' : '*'}, 'meanStdDev' : {'mean' : 'vector_double', 'stddev' : 'vector_double'}, + 'drawContours' : {'contours' : 'vector_vector_Point'}, + 'findContours' : {'contours' : 'vector_vector_Point'}, + 'convexityDefects' : {'contour' : 'vector_Point'}, + 'isContourConvex' : { 'contour' : 'vector_Point2f', }, }, # '', i.e. no class } # func_arg_fix @@ -891,9 +896,13 @@ extern "C" { def get_imports(self, scope_classname, ctype): imports = self.classes[scope_classname or self.Module].imports if ctype.startswith('vector'): - imports.add("java.util.List") imports.add("org.opencv.core.Mat") - imports.add("org.opencv.utils.Converters") + if type_dict[ctype]['j_type'].startswith('CvVector'): + imports.add("org.opencv.core." + type_dict[ctype]['j_type']) + return #TMP + else: + imports.add("java.util.List") + imports.add("org.opencv.utils.Converters") ctype = ctype.replace('vector_', '') j_type = '' if ctype in type_dict: @@ -992,15 +1001,18 @@ extern "C" { j_prologue.append( "List %(n)s_tmplm = new ArrayList((%(n)s != null) ? %(n)s.size() : 0);" % {"n" : a.name } ) j_prologue.append( "Mat %(n)s_mat = Converters.%(t)s_to_Mat(%(n)s, %(n)s_tmplm);" % {"n" : a.name, "t" : a.ctype} ) else: - j_prologue.append( "Mat %(n)s_mat = Converters.%(t)s_to_Mat(%(n)s);" % {"n" : a.name, "t" : a.ctype} ) + if not type_dict[a.ctype]["j_type"].startswith("CvVector"): + j_prologue.append( "Mat %(n)s_mat = Converters.%(t)s_to_Mat(%(n)s);" % {"n" : a.name, "t" : a.ctype} ) + else: + j_prologue.append( "Mat %s_mat = %s;" % (a.name, a.name) ) c_prologue.append( "Mat_to_%(t)s( %(n)s_mat, %(n)s );" % {"n" : a.name, "t" : a.ctype} ) else: - if type_dict[a.ctype]["j_type"] != "Mat": + if not type_dict[a.ctype]["j_type"].startswith("CvVector"): j_prologue.append( "Mat %s_mat = new Mat();" % a.name ) else: j_prologue.append( "Mat %s_mat = %s;" % (a.name, a.name) ) if "O" in a.out: - if type_dict[a.ctype]["j_type"] != "Mat": + if not type_dict[a.ctype]["j_type"].startswith("CvVector"): j_epilogue.append("Converters.Mat_to_%(t)s(%(n)s_mat, %(n)s);" % {"t" : a.ctype, "n" : a.name}) c_epilogue.append( "%(t)s_to_Mat( %(n)s, %(n)s_mat );" % {"n" : a.name, "t" : a.ctype} ) else: @@ -1060,12 +1072,15 @@ extern "C" { tail = "" ret = "return retVal;" if ret_type.startswith('vector'): - ret_val = "Mat retValMat = new Mat(" tail = ")" j_type = type_dict[ret_type]["j_type"] - j_prologue.append( j_type + ' retVal = new Array' + j_type+'();') - self.classes[fi.classname or self.Module].imports.add('java.util.ArrayList') - j_epilogue.append('Converters.Mat_to_' + ret_type + '(retValMat, retVal);') + if j_type.startswith('CvVector'): + ret_val += "new " + j_type + "(" + else: + ret_val = "Mat retValMat = new Mat(" + j_prologue.append( j_type + ' retVal = new Array' + j_type+'();') + self.classes[fi.classname or self.Module].imports.add('java.util.ArrayList') + j_epilogue.append('Converters.Mat_to_' + ret_type + '(retValMat, retVal);') elif ret_type == "void": ret_val = "" ret = "return;" diff --git a/modules/java/src/cpp/converters.cpp b/modules/java/src/cpp/converters.cpp index 7e1f4cf..7d7b092 100644 --- a/modules/java/src/cpp/converters.cpp +++ b/modules/java/src/cpp/converters.cpp @@ -185,11 +185,11 @@ void vector_Point3d_to_Mat(vector& v_point, Mat& mat) void Mat_to_vector_KeyPoint(Mat& mat, vector& v_kp) { v_kp.clear(); - CHECK_MAT(mat.type()==CV_64FC(7) && mat.cols==1); + CHECK_MAT(mat.type()==CV_32FC(7) && mat.cols==1); for(int i=0; i v = mat.at< Vec >(i, 0); - KeyPoint kp((float)v[0], (float)v[1], (float)v[2], (float)v[3], (float)v[4], (int)v[5], (int)v[6]); + Vec v = mat.at< Vec >(i, 0); + KeyPoint kp(v[0], v[1], v[2], v[3], v[4], (int)v[5], (int)v[6]); v_kp.push_back(kp); } return; @@ -199,11 +199,11 @@ void Mat_to_vector_KeyPoint(Mat& mat, vector& v_kp) void vector_KeyPoint_to_Mat(vector& v_kp, Mat& mat) { int count = v_kp.size(); - mat.create(count, 1, CV_64FC(7)); + mat.create(count, 1, CV_32FC(7)); for(int i=0; i >(i, 0) = Vec(kp.pt.x, kp.pt.y, kp.size, kp.angle, kp.response, kp.octave, kp.class_id); + mat.at< Vec >(i, 0) = Vec(kp.pt.x, kp.pt.y, kp.size, kp.angle, kp.response, kp.octave, kp.class_id); } } #endif @@ -245,11 +245,11 @@ void vector_Mat_to_Mat(std::vector& v_mat, cv::Mat& mat) void Mat_to_vector_DMatch(Mat& mat, vector& v_dm) { v_dm.clear(); - CHECK_MAT(mat.type()==CV_64FC4 && mat.cols==1); + CHECK_MAT(mat.type()==CV_32FC4 && mat.cols==1); for(int i=0; i v = mat.at< Vec >(i, 0); - DMatch dm((int)v[0], (int)v[1], (int)v[2], (float)v[3]); + Vec v = mat.at< Vec >(i, 0); + DMatch dm((int)v[0], (int)v[1], (int)v[2], v[3]); v_dm.push_back(dm); } return; @@ -259,11 +259,11 @@ void Mat_to_vector_DMatch(Mat& mat, vector& v_dm) void vector_DMatch_to_Mat(vector& v_dm, Mat& mat) { int count = v_dm.size(); - mat.create(count, 1, CV_64FC4); + mat.create(count, 1, CV_32FC4); for(int i=0; i >(i, 0) = Vec(dm.queryIdx, dm.trainIdx, dm.imgIdx, dm.distance); + mat.at< Vec >(i, 0) = Vec(dm.queryIdx, dm.trainIdx, dm.imgIdx, dm.distance); } } #endif @@ -374,6 +374,19 @@ void vector_vector_Point2f_to_Mat(vector< vector< Point2f > >& vv_pt, Mat& mat) vector_Mat_to_Mat(vm, mat); } +void vector_vector_Point_to_Mat(vector< vector< Point > >& vv_pt, Mat& mat) +{ + vector vm; + vm.reserve( vv_pt.size() ); + for(size_t i=0; i& v_vec, Mat& mat) { mat = Mat(v_vec, true); diff --git a/modules/java/src/cpp/converters.h b/modules/java/src/cpp/converters.h index e1118e9..b1105ca 100644 --- a/modules/java/src/cpp/converters.h +++ b/modules/java/src/cpp/converters.h @@ -64,4 +64,5 @@ void vector_vector_char_to_Mat(std::vector< std::vector< char > >& vv_ch, cv::Ma void Mat_to_vector_vector_Point(cv::Mat& mat, std::vector< std::vector< cv::Point > >& vv_pt); void vector_vector_Point2f_to_Mat(std::vector< std::vector< cv::Point2f > >& vv_pt, cv::Mat& mat); +void vector_vector_Point_to_Mat(std::vector< std::vector< cv::Point > >& vv_pt, cv::Mat& mat); diff --git a/modules/java/src/java/core+CvVector.java b/modules/java/src/java/core+CvVector.java new file mode 100644 index 0000000..11fafca --- /dev/null +++ b/modules/java/src/java/core+CvVector.java @@ -0,0 +1,35 @@ +package org.opencv.core; + +public class CvVector extends Mat { + protected int depth; + protected int channels; + + protected CvVector(int d, int ch) { + super(); + depth = d; + channels = ch; + } + + protected CvVector(int d, int ch, long addr) { + super(addr); + depth = d; + channels = ch; + if( !empty() && checkVector(channels, depth) < 0 ) + throw new IllegalArgumentException("Incomatible Mat"); + //FIXME: do we need release() here? + } + + protected CvVector(int d, int ch, Mat m) { + super(m, Range.all()); + depth = d; + channels = ch; + if( !empty() && checkVector(channels, depth) < 0 ) + throw new IllegalArgumentException("Incomatible Mat"); + //FIXME: do we need release() here? + } + + protected void create(int cnt) { + if(cnt>0) + super.create(cnt, 1, CvType.makeType(depth, channels)); + } +} diff --git a/modules/java/src/java/core+CvVectorByte.java b/modules/java/src/java/core+CvVectorByte.java new file mode 100644 index 0000000..656eb9f --- /dev/null +++ b/modules/java/src/java/core+CvVectorByte.java @@ -0,0 +1,42 @@ +package org.opencv.core; + +public class CvVectorByte extends CvVector { + private static final int _d = CvType.CV_8U; + + public CvVectorByte(int ch) { + super(_d, ch); + } + + public CvVectorByte(int ch, long addr) { + super(_d, ch, addr); + } + + public CvVectorByte(long addr) { + super(_d, 1, addr); + } + + public CvVectorByte(int ch, Mat m) { + super(_d, ch, m); + } + + public CvVectorByte(int ch, byte[] a) { + super(_d, ch); + if(a!=null) { + int cnt = a.length / ch; + create(cnt); + put(0, 0, a); + } + } + + public byte[] toArray(byte[] a) { + int cnt = (int) total() * channels; + if(cnt == 0) + return new byte[0];//null; + byte[] res = a; + if(res==null || res.length> pts, List mats) { + public static Mat vector_vector_Point_to_Mat(List pts, List mats) { Mat res; int lCount = (pts != null) ? pts.size() : 0; if (lCount > 0) { - for (List lpt : pts) - mats.add(vector_Point_to_Mat(lpt)); + for (CvVectorPoint vpt : pts) + mats.add(vpt); res = vector_Mat_to_Mat(mats); } else { res = new Mat(); @@ -483,8 +488,23 @@ public class Converters { return res; } + public static void Mat_to_vector_vector_Point(Mat m, List pts) { + if (pts == null) + throw new java.lang.IllegalArgumentException("Output List can't be null"); + + if (m == null) + throw new java.lang.IllegalArgumentException("Input Mat can't be null"); + + List mats = new ArrayList(m.rows()); + Mat_to_vector_Mat(m, mats); + for (Mat mi : mats) { + CvVectorPoint pt = new CvVectorPoint(mi); + pts.add(pt); + } + } + // vector_vector_Point2f - public static void Mat_to_vector_vector_Point2f(Mat m, List> pts) { + public static void Mat_to_vector_vector_Point2f(Mat m, List pts) { if (pts == null) throw new java.lang.IllegalArgumentException("Output List can't be null"); @@ -494,19 +514,18 @@ public class Converters { List mats = new ArrayList(m.rows()); Mat_to_vector_Mat(m, mats); for (Mat mi : mats) { - List pt = new ArrayList(); - Mat_to_vector_Point2f(mi, pt); + CvVectorPoint2f pt = new CvVectorPoint2f(mi); pts.add(pt); } } // vector_vector_KeyPoint - public static Mat vector_vector_KeyPoint_to_Mat(List> kps, List mats) { + public static Mat vector_vector_KeyPoint_to_Mat(List kps, List mats) { Mat res; int lCount = (kps != null) ? kps.size() : 0; if (lCount > 0) { - for (List lkp : kps) - mats.add(vector_KeyPoint_to_Mat(lkp)); + for (CvVectorKeyPoint vkp : kps) + mats.add(vkp); res = vector_Mat_to_Mat(mats); } else { res = new Mat(); @@ -514,7 +533,7 @@ public class Converters { return res; } - public static void Mat_to_vector_vector_KeyPoint(Mat m, List> kps) { + public static void Mat_to_vector_vector_KeyPoint(Mat m, List kps) { if (kps == null) throw new java.lang.IllegalArgumentException("Output List can't be null"); @@ -524,9 +543,8 @@ public class Converters { List mats = new ArrayList(m.rows()); Mat_to_vector_Mat(m, mats); for (Mat mi : mats) { - List lkp = new ArrayList(); - Mat_to_vector_KeyPoint(mi, lkp); - kps.add(lkp); + CvVectorKeyPoint vkp = new CvVectorKeyPoint(mi); + kps.add(vkp); } } @@ -600,12 +618,12 @@ public class Converters { } // vector_vector_DMatch - public static Mat vector_vector_DMatch_to_Mat(List> lldm, List mats) { + public static Mat vector_vector_DMatch_to_Mat(List lvdm, List mats) { Mat res; - int lCount = (lldm != null) ? lldm.size() : 0; + int lCount = (lvdm != null) ? lvdm.size() : 0; if (lCount > 0) { - for (List ldm : lldm) - mats.add(vector_DMatch_to_Mat(ldm)); + for (CvVectorDMatch vdm : lvdm) + mats.add(vdm); res = vector_Mat_to_Mat(mats); } else { res = new Mat(); @@ -613,8 +631,8 @@ public class Converters { return res; } - public static void Mat_to_vector_vector_DMatch(Mat m, List> lldm) { - if (lldm == null) + public static void Mat_to_vector_vector_DMatch(Mat m, List lvdm) { + if (lvdm == null) throw new java.lang.IllegalArgumentException("Output List can't be null"); if (m == null) @@ -622,20 +640,20 @@ public class Converters { List mats = new ArrayList(m.rows()); Mat_to_vector_Mat(m, mats); + lvdm.clear(); for (Mat mi : mats) { - List ldm = new ArrayList(); - Mat_to_vector_DMatch(mi, ldm); - lldm.add(ldm); + CvVectorDMatch vdm = new CvVectorDMatch(mi); + lvdm.add(vdm); } } // vector_vector_char - public static Mat vector_vector_char_to_Mat(List> llb, List mats) { + public static Mat vector_vector_char_to_Mat(List lvb, List mats) { Mat res; - int lCount = (llb != null) ? llb.size() : 0; + int lCount = (lvb != null) ? lvb.size() : 0; if (lCount > 0) { - for (List lb : llb) - mats.add(vector_char_to_Mat(lb)); + for (CvVectorByte vb : lvb) + mats.add(vb); res = vector_Mat_to_Mat(mats); } else { res = new Mat(); diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java b/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java index facad4c..3a74f90 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java @@ -4,11 +4,10 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.LinkedList; -import java.util.List; import org.opencv.android.Utils; import org.opencv.core.Core; +import org.opencv.core.CvVectorRect; import org.opencv.core.Mat; import org.opencv.core.Rect; import org.opencv.core.Scalar; @@ -81,11 +80,12 @@ class FdView extends SampleCvViewBase { if (mCascade != null) { int height = mGray.rows(); int faceSize = Math.round(height * FdActivity.minFaceSize); - List faces = new LinkedList(); + CvVectorRect faces = new CvVectorRect(); mCascade.detectMultiScale(mGray, faces, 1.1, 2, 2 // TODO: objdetect.CV_HAAR_SCALE_IMAGE , new Size(faceSize, faceSize), new Size()); - for (Rect r : faces) + Rect ra[] = null; + for (Rect r : faces.toArray(ra)) Core.rectangle(mRgba, r.tl(), r.br(), new Scalar(0, 255, 0, 255), 3); } diff --git a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java index 406ffe2..ac7bbfa 100644 --- a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java +++ b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java @@ -1,13 +1,17 @@ package org.opencv.samples.tutorial2; +import java.util.ArrayList; +import java.util.List; + import org.opencv.android.Utils; import org.opencv.core.Core; +import org.opencv.core.CvVectorPoint; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; -import org.opencv.imgproc.Imgproc; import org.opencv.highgui.Highgui; import org.opencv.highgui.VideoCapture; +import org.opencv.imgproc.Imgproc; import android.content.Context; import android.graphics.Bitmap; @@ -18,6 +22,10 @@ class Sample2View extends SampleCvViewBase { private Mat mRgba; private Mat mGray; private Mat mIntermediateMat; + private Mat mIntermediateMat2; + private Mat mEmpty; + private Scalar lo, hi; + private Scalar bl, wh; public Sample2View(Context context) { super(context); @@ -32,11 +40,18 @@ class Sample2View extends SampleCvViewBase { mGray = new Mat(); mRgba = new Mat(); mIntermediateMat = new Mat(); + mIntermediateMat2 = new Mat(); + mEmpty = new Mat(); + lo = new Scalar(85, 100, 30); + hi = new Scalar(130, 255, 255); + bl = new Scalar(0, 0, 0, 255); + wh = new Scalar(255, 255, 255, 255); } } @Override protected Bitmap processFrame(VideoCapture capture) { + /**/ switch (Sample2NativeCamera.viewMode) { case Sample2NativeCamera.VIEW_MODE_GRAY: capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); @@ -44,14 +59,39 @@ class Sample2View extends SampleCvViewBase { break; case Sample2NativeCamera.VIEW_MODE_RGBA: capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); - Core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3/* CV_FONT_HERSHEY_COMPLEX */, 2, new Scalar(255, 0, 0, 255), 3); + Core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3, 2, new Scalar(255, 0, 0, 255), 3); break; case Sample2NativeCamera.VIEW_MODE_CANNY: - capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); + /*capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); Imgproc.Canny(mGray, mIntermediateMat, 80, 100); Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4); - break; + */ + capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); + Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGB2HSV_FULL); + Core.inRange(mIntermediateMat, lo, hi, mIntermediateMat2); // green + Imgproc.dilate(mIntermediateMat2, mIntermediateMat2, mEmpty); + // + List contours = new ArrayList(); + Mat hierarchy = new Mat(); + Imgproc.findContours(mIntermediateMat2, contours, hierarchy,Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); + Log.d("processFrame", "contours.size()" + contours.size()); + double maxArea = 0; + int indexMaxArea = -1; + for (int i = 0; i < contours.size(); i++) { + double s = Imgproc.contourArea(contours.get(i)); + if(s > maxArea){ + indexMaxArea = i; + maxArea = s; + } + } + + mRgba.setTo(bl); + Imgproc.drawContours(mRgba, contours, indexMaxArea, wh); + // + //Imgproc.cvtColor(mIntermediateMat2, mRgba, Imgproc.COLOR_GRAY2RGBA); + break; } + /**/ Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); @@ -78,6 +118,9 @@ class Sample2View extends SampleCvViewBase { if (mIntermediateMat != null) mIntermediateMat.release(); + if (mIntermediateMat2 != null) + mIntermediateMat2.release(); + mRgba = null; mGray = null; mIntermediateMat = null; -- 2.7.4