从对象 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 代码。
祝你好运。
我正在研究 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 代码。 祝你好运。