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

时间:2015-03-12 16:14:39

标签: android c++ opencv java-native-interface iplimage

我正在开发android / JNI / Opencv。我需要读取一个jObject设置为Bitmap,将其发送为函数内的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);

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

1 个答案:

答案 0 :(得分:0)

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