从对象 Bitmap 设置 IplImage 并从 IplImage 获取结果为 jIntArray

Set IplImage from object Bitmap and get result from IplImage to be a jIntArray

我正在研究 android / JNI / Opencv。我需要读取一个设置为位图的 jObject,将其发送为一个函数内部的 IplImage *,然后输出将被转换回 jintArray。这是我的代码:

    JNIEXPORT void JNICALL Java_com_cs_here_there_nProcessOnBitmap(JNIEnv* env,
jobject thiz, jint width, jint height, jbyteArray jb, jintArray rgbaData, jobject dinfo, jobject srcimg)
{
// convert img
    AndroidBitmapInfo bInfo;
    char *bPixs;
    int bRet;
    if ((bRet = AndroidBitmap_getInfo(env, srcimg, &bInfo)) < 0) {
        dmz_debug_log("AndroidBitmap_getInfo failed(src)! error = %d", bRet);
        return;
    }else{
        dmz_debug_log("bRet = %d", bRet);
    }
    if (bInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        dmz_debug_log("Bitmap(src) format is not RGBA_8888!");
        return;
    }else{
        dmz_debug_log("ANDROID_BITMAP_FORMAT = %i", bInfo.format);
    }
    if ((bRet = AndroidBitmap_lockPixels(env, srcimg, (void**)&bPixs)) < 0) {
        dmz_debug_log("AndroidBitmap_lockPixels() failed(src)! error = %d", bRet);
        return;
    }
    IplImage* bimg = cvCreateImage(cvSize(bInfo.width,bInfo.height), IPL_DEPTH_8U, 4);
    memcpy(bimg->imageData, bPixs, bimg->imageSize);
    AndroidBitmap_unlockPixels(env, srcimg);
//Resize channels
IplImage* img = cvCreateImage(cvSize(bInfo.width,bInfo.height), IPL_DEPTH_8U, 3);
cvCvtColor(bimg, img, CV_RGBA2BGR);
IplImage * pImage = ImageProcessor ( img );
int len = pImage->width * pImage->height;
env->SetIntArrayRegion(rgbaData,0,len,(jint*) pImage->imageData);
cvReleaseImage(&pImage);
dmz_debug_log("[nProcessOnBitmap()] END");
}

我正在尝试将 srcimg 转换为 plImage* bimg,然后将此图像调整为 3 通道 (img)。然后将此 img 发送到 ImageProcessor()。然后应将输出转换为 jintArray 以供 Java.

读取
Bitmap bmp_4 = Bitmap.createBitmap(detectedBitmap_width, detectedBitmap_height, Bitmap.Config.ARGB_8888);

遗憾的是,我没有得到预期的结果。你有什么主意吗?请帮忙。 提前致谢。

我通过查看 Java 文件中的 JPG 文件创建解决了这个问题。我使用的 JPG 创建也是基于 ARGB,所以我需要将 ARGB 格式发送到 Java 代码。 祝你好运。