2014-12-02 109 views
0

将OpenCV vector< std::vector<Point > > contours从JNI C++函数传递到Android中的Java的最佳方式是什么?我目前的做法是使用双打数组,但效率很低。有没有办法使用指针?将OpenCV轮廓从JNI C++函数传递到Java中的Android

+0

java中没有指针。你可以将一个指针值存储到java中,但这只能帮助保持参考。 – Fildor 2014-12-02 06:14:06

+1

也许这个答案可以帮助你http://stackoverflow.com/a/23116736/2455351(这是为传递一个矢量) – migue02 2014-12-02 07:51:20

+1

FYI,我们可以直接使用[JavaCPP](https:// github。 com/bytedeco/javacpp /):http://bytedeco.org/javacpp-presets/opencv/apidocs/org/bytedeco/javacpp/class-use/opencv_core.PointVectorVector.html – 2014-12-06 08:13:59

回答

1

下面是从JavaCPP Presets for OpenCV包装访问轮廓的有效途径:

import org.bytedeco.javacpp.indexer.*; 
import static org.bytedeco.javacpp.opencv_core.*; 
import static org.bytedeco.javacpp.opencv_imgproc.*; 
import static org.bytedeco.javacpp.opencv_highgui.*; 

public class Contours { 
    public static void main(String[] args) { 
     Mat grayscaleImage = imread("lena.png", CV_LOAD_IMAGE_GRAYSCALE); 
     Mat binarizedImage = new Mat(); 
     MatVector contours = new MatVector(); 
     threshold(grayscaleImage, binarizedImage, 128, 255, THRESH_BINARY); 
     findContours(binarizedImage, contours, RETR_LIST, CHAIN_APPROX_NONE); 
     int contoursSize = (int)contours.size(); 
     System.out.println("size = " + contoursSize); 
     for (int contourIdx = 0; contourIdx < contoursSize; contourIdx++) { 
      // compute center 
      float x = 0, y = 0; 
      Mat contour = contours.get(contourIdx); 
      IntIndexer points = contour.createIndexer(false); 
      int pointsSize = contour.rows(); 
      for (int pointIdx = 0; pointIdx < pointsSize; pointIdx++) { 
       x += points.get(pointIdx, 0); 
       y += points.get(pointIdx, 1); 
      } 
      System.out.println("center = (" + x/pointsSize + ", " + y/pointsSize + ")"); 
     } 
    } 
} 

为简单起见,我使用的Java SE,但我们可以做Android上的同样的事情。

2

那么,你可以在Java端创建一个类,相当于C++端的vector< std::vector<Point > >。然后,在C++中编写一个序列化器函数,并在Java中编写解除器方法。

你的串行器可以是它们由,;分隔双重价值,它可以easliy在Java中反序列化的组成String

以这种方式,不是发送多个数组,而是只能发送一个字符串。在将其转换为double并将其转换回来时,您需要小心double的精度。