gpt4 book ai didi

android - NDK 位图操作使用 OpenCv 蓝色是橙色?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:32 24 4
gpt4 key购买 nike

我正在测试使用 OpenCv 在 JNI 层上操作位图像素的性能。

两种选择:
1. 传递整数数组,操作像素并将像素写回位图。 [41 毫秒]
2.传递整个Bitmap。 [35 毫秒]

我注意到传递位图比传递像素数组并将该数组分配给位图快大约 5 毫秒。

问题是,使用选项 2 时,我失去了蓝色并得到了橙色,而不是我期望的蓝色。图片是ARGB,好像改成RGBA了?可能是什么问题?

方法一:
Java

Bitmap out = Bitmap.createBitmap(width, height, Config.ARGB_8888);

int[] rgba = new int[width*height];

mSmasher.loadImage(imagePath, rgba, 0);

out.setPixels(rgba, 0, width, 0, 0, width, height);

JNI

JNIEXPORT void JNICALL Java_com_vblast_smasher_Smasher_loadImage
(JNIEnv *pEnv, jobject obj, jstring jFilePath, jintArray jbgra, jint options)
{
jint* _bgra = pEnv->GetIntArrayElements(jbgra, 0);
const char *filePath = pEnv->GetStringUTFChars(jFilePath, 0);

if (NULL != filePath)
{
// init our output image
Mat bgra(outputHeight, outputWidth, CV_8UC4, (unsigned char *)_bgra);

// bgra image manipulations
}

pEnv->ReleaseIntArrayElements(jbgra, _bgra, 0);
pEnv->ReleaseStringUTFChars(jFilePath, filePath);
}

方法二:

JNIEXPORT void JNICALL Java_com_vblast_smasher_Smasher_getLayersBitmap
(JNIEnv *pEnv, jobject obj, jobject bitmap)
{
int ret;
AndroidBitmapInfo info;
void* pixels = 0;

if ((ret = AndroidBitmap_getInfo(pEnv, bitmap, &info)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}

if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888 )
{
LOGE("Bitmap format is not RGBA_8888!");
return;
}

if ((ret = AndroidBitmap_lockPixels(pEnv, bitmap, &pixels)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}

// init our output image
Mat mbgra(info.height, info.width, CV_8UC4, pixels);

mLayers[0].copyTo(mbgra);

AndroidBitmap_unlockPixels(pEnv, bitmap);
}

解决方案 05/23:
问题是当使用整数数组并将其传递给 JNI 时,字节顺序从 ARGB (java) 更改为 BGRA(native)。这对于处理像素来说很好。然而,在锁定像素时传递实际的 Bitmap 对象时,字节顺序没有改变,因此需要在修改像素数据后更改它。

cvtColor(mbgra, mbgra, COLOR_BGR2RGBA, 4); 

最佳答案

Opencv 命令是 BGR 而不是 RGB。我猜 A 在正确的位置(或者你会看到半透明的图像),但蓝色和红色会交换。

关于android - NDK 位图操作使用 OpenCv 蓝色是橙色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10711830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com