отправка изображений из android studio на cpp - PullRequest
0 голосов
/ 13 января 2020

мы работаем над проектом в android студии. мы пытаемся отправить массив изображений из java части в cpp. затем мы хотим выполнить некоторые действия по обработке изображений и после этого отправить изображения обратно на сторону java.

, мы представляем каждое изображение в виде матрицы и пытаемся создать массив матриц для отправки. мы пробовали несколько разных способов, но не смогли найти способ сделать это правильно


Java:

static Mat[] imageMats = new Mat[3];

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.imageToUpload:
                Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(galleryIntent, RESUALT_LOAD_IMAGE);
                break;
            case R.id.bottonUpload:

                start(imageMats, counter)

public native Mat start(Mat[] imageMats, int N);


Cpp:
Mat
Java_com_example_trycpp_MainActivity_start(JNIEnv* env, jobject thisobject, jobjectArray imageMats, jint N){
Data D;
D.source = vector<cv::Mat>(N)
for (int i = 0; i < N; ++i)
{
    D.sources[i] = (cv::Mat)(imageMats[i]); //error - _jobjectArray can't be cast to type "Mat": class "_jobjectAray" is not compatible with class "Mat"
}

}

мы пытаемся использовать этот способ в части cpp, но приложение не работает. при попытке отладки мы увидели ошибку сегментации:

cpp:
jclass thisclass = env->GetObjectClass(thisobject);
jclass matclass = (env)->FindClass("org/opencv/core/Mat");

// Get methods and fields
jmethodID getPtrMethod = (env)->GetMethodID(matclass, "getNativeObjAddr", "()J");
jfieldID mrgbafieldid = env->GetFieldID(thisclass, "mRgba", "Lorg/opencv/core/Mat;");
jfieldID bufimgsfieldid = env->GetFieldID(thisclass, "bufImgs", "[Lorg/opencv/core/Mat;");

// Let's start: Get the fields
jobject mrgba = env->GetObjectField(thisobject, mrgbafieldid);
jobjectArray bufimgsArray = (jobjectArray)env->GetObjectField(thisobject, bufimgsfieldid);
D.sources[i] = *(cv::Mat*)env->CallLongMethod(env->GetObjectArrayElement(imageMats, i), getPtrMethod);

1 Ответ

0 голосов
/ 13 января 2020

Чтобы передать изображение из Android части в исходную часть, вы можете использовать android / bitmap.h из NDK.

Вот пример, который преобразует растровое изображение в Array2D (из dlib). Я надеюсь, что вы можете адаптировать его к своим случаям.

#include "jni.h"
#include "android/log.h"
#include "android/bitmap.h"

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,    TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,     TAG, __VA_ARGS__)

void convertBitmapToArray2d(JNIEnv *env,
                            jobject bitmap,
                            dlib::array2d<dlib::bgr_pixel> &out) {
    AndroidBitmapInfo bitmapInfo;
    void *pixels;
    int state;

    if (0 > (state = AndroidBitmap_getInfo(env, bitmap, &bitmapInfo))) {
        LOGE("AndroidBitmap_getInfo() failed! error=%d", state);
        return;
    } else if (bitmapInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGE("Bitmap format is not RGB_565!");
    }

    // Lock the bitmap for copying the pixels safely.
    if (0 > (state = AndroidBitmap_lockPixels(env, bitmap, &pixels))) {
        LOGE("AndroidBitmap_lockPixels() failed! error=%d", state);
        return;
    }

    LOGI("info.width=%d, info.height=%d", bitmapInfo.width, bitmapInfo.height);
    out.set_size((long) bitmapInfo.height, (long) bitmapInfo.width);

    char *line = (char *) pixels;
    for (int h = 0; h < bitmapInfo.height; ++h) {
        for (int w = 0; w < bitmapInfo.width; ++w) {
            uint32_t *color = (uint32_t *) (line + 4 * w);

            out[h][w].red = (unsigned char) (0xFF & (*color));
            out[h][w].green = (unsigned char) (0xFF & ((*color) >> 8));
            out[h][w].blue = (unsigned char) (0xFF & ((*color) >> 16));
        }

        line = line + bitmapInfo.stride;
    }

    // Unlock the bitmap.
    AndroidBitmap_unlockPixels(env, bitmap);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...