将OpenCV轮廓从JNI C ++函数传递到Android中的Java

时间:2014-12-02 05:56:22

标签: android c++ opencv java-native-interface

将OpenCV vector< std::vector<Point > > contours从JNI C ++函数传递到Android中的Java的最佳方法是什么?我目前的方法是使用双精度数组,但这是非常低效的。有没有办法使用指针?

2 个答案:

答案 0 :(得分:2)

好吧,你可以在Java端创建一个等同于C ++端vector< std::vector<Point > >的类。然后,用C ++编写一个序列化函数,用Java编写deserailizer方法。

您的序列化程序可以是由String,分隔的双值组成的;,可以在Java中轻松反序列化。

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

答案 1 :(得分: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上做同样的事情。