我目前正在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是您自定义的本地函数