2014-12-02 111 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的精度。