OpenCV Android完全使用c++

OpenCV Android using entirely in c++

本文关键字:c++ Android OpenCV      更新时间:2023-10-16

我注意到 github 中的大多数 Android 示例都使用 java 中的 opencv。我现在在iOS中有一个工作的应用程序,我尽力将opencv调用与桥接标头分开。

在安卓中可以做同样的事情吗?我注意到像CascadeClassifier这样的opencv检测器都是用java而不是c++的。

我可以像iOS一样在Android中实现同样的事情吗?

你可以完全在C++中使用,并且必须使用 JNI 才能让 java 代码调用本机代码。

下载Opencv-android-sdk后,您只能导入所需的头文件和".a"文件。java文件是可选的,提供给那些不知道C++的人。
比如java类CascadeClassifier,最后叫原生函数,你也可以这样做,其实就是JNI:

 // C++:   CascadeClassifier::CascadeClassifier()
private static native long CascadeClassifier_0();
// C++:   CascadeClassifier::CascadeClassifier(string filename)
private static native long CascadeClassifier_1(String filename);
// C++:  void CascadeClassifier::detectMultiScale(Mat image, vector_Rect& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size())
private static native void detectMultiScale_0(long nativeObj, long image_nativeObj, long objects_mat_nativeObj, double scaleFactor, int minNeighbors, int flags, double minSize_width, double minSize_height, double maxSize_width, double maxSize_height);
private static native void detectMultiScale_1(long nativeObj, long image_nativeObj, long objects_mat_nativeObj);
// C++:  void CascadeClassifier::detectMultiScale(Mat image, vector_Rect& objects, vector_int rejectLevels, vector_double levelWeights, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size(), bool outputRejectLevels = false)
private static native void detectMultiScale_2(long nativeObj, long image_nativeObj, long objects_mat_nativeObj, long rejectLevels_mat_nativeObj, long levelWeights_mat_nativeObj, double scaleFactor, int minNeighbors, int flags, double minSize_width, double minSize_height, double maxSize_width, double maxSize_height, boolean outputRejectLevels);
private static native void detectMultiScale_3(long nativeObj, long image_nativeObj, long objects_mat_nativeObj, long rejectLevels_mat_nativeObj, long levelWeights_mat_nativeObj);
// C++:  bool CascadeClassifier::empty()
private static native boolean empty_0(long nativeObj);
// C++:  bool CascadeClassifier::load(string filename)
private static native boolean load_0(long nativeObj, String filename);
// native support for java finalize()
private static native void delete(long nativeObj);