openCV java代码传递点对象到本机代码(c++)



我目前正在Android上开发一个openCV应用程序。到目前为止,我的应用程序都是用Java编写的,但是有一个函数将MatOfPoint对象作为参数,我想在本机代码(c++)中实现。从openCV教程2我知道如何将Mat对象传递到本机代码方法,但是其他类的对象,如Point和MatOfPoint呢?有任何示例代码来说明如何做到这一点吗?

谢谢。

对于一个点,我建议将x和y作为双精度体传递。对于MatOfPoints和其他:

OpenCV自带转换器,可以在Mat中存储不同类型的内容。

java端有一个转换器,它是openv -android-sdk的一部分org.opencv.utils.Converters

我在opencv repo中也找到了一个c++转换器,但头文件不包括在opencv-android-sdk中,我无法通过添加头文件使其工作,所以我将converters.h和converters.cpp复制到我的jni文件夹中,并将导入更正为指向正确的位置(但这可能不是必要的)。

https://github.com/Itseez/opencv/blob/master/modules/java/generator/src/cpp/converters.cpp

这个转换器可以用来传递MatOfPoint或List以及更多的本地代码,在那里你必须再次将其转换为c++类型(与MatOfPoint等价的c++类型是std::vector<简历:点>;与List等价的是std::vector>)

使用此转换器,您可以将MatOfPoint"转换"为Mat,然后使用vector_Point_to_Mat或Mat_to_vector_Point(返回列表,但使用MatOfPoint. fromlist您可以从中获得MatOfPoint)

下面是一个如何传递List到native级别并返回MatOfPoint的示例。

Java代码:

public class YourJavaWrapper {
    static {
        System.loadLibrary("yourlibrary");
    }
    public static MatOfPoint findMostFencyMatOfPoints(List<MatOfPoint> contours){
        List<Mat> contoursTmp = new ArrayList<Mat>(contours.size());
        Mat inputMat = Converters.vector_vector_Point_to_Mat(contours, contoursTmp);
        Mat outputMat = new Mat();
        findMostFencyMatOfPoints(inputMat.nativeObj, outputMat.nativeObj);
        List<Point> pointsTmp = new ArrayList<Point>();
        Converters.Mat_to_vector_Point(outputMat, pointsTmp);
        MatOfPoint matOfInterest = new MatOfPoint();
        matOfInterest.fromList(pointsTmp);
        outputMat.release();
        return matOfInterest;
    }
    private static native void findMostFencyMatOfPoints(long inputMatAddress, long outPutMatAddress);
}
c++代码:

using namespace std;
using namespace cv;
extern "C" JNIEXPORT void JNICALL Java_org_example_yourpackage_YourJavaWrapper_findMostFencyMatOfPoints(JNIEnv*, jobject, jlong inputMatAddress, jlong outPutMatAddress)
{
    cv::Mat& vectorVectorPointMat = *(cv::Mat*) inputMatAddress;
    std::vector< std::vector< cv::Point > > contours;
    Mat_to_vector_vector_Point(vectorVectorPointMat, contours);
    std::vector<cv::Point> fencyVectorOfPoints = findMostFencyVectorOfPoint(contours);
    cv::Mat& largestSquareMat = *(cv::Mat*) outPutMatAddress;
    vector_Point_to_Mat(fencyVectorOfPoints, outPutMatAddress);
}

在这个例子中findMostFencyVectorOfPoint是您自定义的本地函数

相关内容

  • 没有找到相关文章

最新更新