传递给Android的内容's NDK,以便可以使用OpenCV加载图像



信息

我有一个Android NDK/OpenCV项目(运行原生c++代码(。

我正在尝试将图像加载到NDK,所以我将图像加载为位图,这样我就可以获得它的路径。

我不想把整个图像传递给NDK(像这个答案、这个答案或其他答案(,我只想把一个字符串(例如图像路径(或指针或类似的东西传递给NDK,然后用OpenCV从NDK读取图像。

我试着使用OpenCV的人脸检测示例作为参考,但它并没有真正做到我想要做的

为了获得Java中的路径字符串,我尝试了以下操作:

Uri uri = data.getData();
String imagePath = uri.getEncodedPath();

或者这个:

Cursor imageCursor;
int imageNameIndex, imageSizeIndex;
Uri uri = data.getData();
imageCursor = getContentResolver().query(uri, null, null, null, null);
imageNameIndex = imageCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
String imagePath = imageCursor.getString(nameIndex);

或者说:

String imageFullPath = Environment.getExternalStorageDirectory() + "/Pictures/" + imagePath;

或者说:

String imageFullPath = Environment.DIRECTORY_PICTURES + "/" + imagePath;

它得到了像/storage/emulated/0/Pictures/my-image.jpgPictures/my-image.jpgmy-image.jpg/document/image%3A167这样的字符串。

然后我将字符串传递给NDK(将其转换为char *(,并尝试使用OpenCV的imread:在C++上加载图像

Mat image = imread(image_path, IMREAD_COLOR);

所有上述试验都导致空的Mat对象(所有int值等于0并且指针是NULL(。

我也尝试过类似的指针方法。

问题

这是OpenCV的问题吗?我应该以某种方式初始化Mat吗?

如果没有,我应该向NDK传递什么字符串/指针,以便它可以加载图像?

传递指针

Java端:

Activity.java:

// create a mat object with CvType.CV_8UC4, for Android's RGBA_8888
Mat passToNativeMat = new Mat(height, width, CvType.CV_8UC4);
// convert (for example) a bitmap image to Mat object
Utils.bitmapToMat(bitmap, passToNativeMat);
// get the native address of the Mat object created
long passToNativeMatAddress = passToNativeMat.getNativeObjAddr();
// call the Native function
String imageToJNIResult = imageToJNI(passToNativeMatAddress);
// native declarations
public native String imageToJNI(long imagePointer);

原生侧:

native-lib.cpp:

extern "C"
JNIEXPORT jstring JNICALL
Java_package_activity_imageToJNI(
JNIEnv* env,
jobject thiz,
jlong imagePointer) {
Mat& image_in_native = *(Mat*) imagePointer;
// do something with image Mat object
string return_string = "Return string";
return env->NewStringUTF(return_string.c_str());

}

传递字节数组

Java端:

public native String byteToJNI(byte[] myArray);

原生侧:

extern "C" JNIEXPORT jstring JNICALL
Java_package_activity_byteToJNI(
JNIEnv* env,
jobject thiz,
jbyteArray array) {
Mat * mat = ByteToMat(array);
string return_string = "Return string";
return env->NewStringUTF(return_string.c_str());
}

相关内容

最新更新