Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用OpenCv进行NDK位图操作蓝色是橙色?_Android_Opencv_Android Ndk - Fatal编程技术网

Android 使用OpenCv进行NDK位图操作蓝色是橙色?

Android 使用OpenCv进行NDK位图操作蓝色是橙色?,android,opencv,android-ndk,Android,Opencv,Android Ndk,我正在测试使用OpenCv在JNI层上操作位图像素的性能 两个选项: 1.传递整数数组,操作像素并将像素写回位图。[41ms] 2.传递整个位图。[35毫秒] 我注意到传递位图要比传递像素数组并将数组分配给位图快5毫秒左右 问题是,使用选项2时,我失去了蓝色,得到了橙色,而不是我期望的蓝色。图像是ARGB,它似乎已更改为RGBA?可能是什么问题 方法1: 爪哇 JNI 方法2: JNIEXPORT void JNICALL Java_com_vblast_smasher_Smasher_getL

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

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

我注意到传递位图要比传递像素数组并将数组分配给位图快5毫秒左右

问题是,使用选项2时,我失去了蓝色,得到了橙色,而不是我期望的蓝色。图像是ARGB,它似乎已更改为RGBA?可能是什么问题

方法1:
爪哇

JNI

方法2:

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);
}

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

在JNI中,颜色值返回为ARGB,而在JAVA中是RGBA 试试这个

alpha=(int)((color&0xFF000000)>>24);
蓝色=(int)((颜色&0xFF0000)>>16);
绿色=(int)((颜色&0x00FF00)>>8);
红色=(内部)(颜色和0x0000FF);
蓝色=蓝色*α/255;
绿色=绿色*α/255;
红色=红色*α/255;
int-tmp=0;
tmp=红色;
红色=蓝色;
蓝色=tmp;

color=((我对你的速度测试很感兴趣。你能总结一下这两种方法吗,我不明白第一种方法意味着什么。添加了一些细节…希望它有意义:)我有点想起clrConvert(sp?)中有一个BGR2RGB。还有混合通道(同样,sp?现在离我的opencv2refman.pdf很远)。啊!这是解决方案。cvtColor(mbgra,mbgra,COLOR_BGR2RGBA,4);给你答案,因为你在解决方案的目标位置。另外,它帮助我知道有参考手册这样的东西!:)我怀疑你必须这么做。我想没有办法避免交换。
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);
}
cvtColor(mbgra, mbgra, COLOR_BGR2RGBA, 4); 
alpha = (int) ((color & 0xFF000000) >> 24);
    blue = (int) ((color & 0xFF0000) >> 16);
    green = (int)((color & 0x00FF00) >> 8);
    red = (int) (color & 0x0000FF);
    blue = blue * alpha / 255;
    green = green * alpha / 255;
    red = red * alpha / 255;

    int tmp = 0;
    tmp = red;
    red = blue;
    blue = tmp;

    color =  ((alpha<< 24) & 0xFF000000) | ((blue<< 16) & 0xFF0000) |
                  ((green << 8) & 0x00FF00) |
                  (red & 0x0000FF);