【问题标题】:Code is not displaying Grayscale image using android ndk代码未使用 android ndk 显示灰度图像
【发布时间】:2014-07-26 08:11:25
【问题描述】:

我的代码没有将图像显示为灰度,因为我在 eclipse 中使用了 android ndk

jni part :

下面的部分亮度对我有用

   jint* _in = env->GetIntArrayElements(in, 0);
   jint* _out = env->GetIntArrayElements(out, 0);

   Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
   Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);
   vector<Mat> sChannels;
   split(mSrc, sChannels);

        for(int i=0; i<sChannels.size(); i++)
        {
            Mat channel = sChannels[i];
            equalizeHist(channel, channel);
        }
        merge(sChannels, bgra);
   env->ReleaseIntArrayElements(in, _in, 0);
   env->ReleaseIntArrayElements(out, _out, 0);

   jint retVal;
   int ret = 1;
   retVal = jint(retVal);
   return retVal;

但是当我更改上面相同的代码以将图像转换为灰度时,它不会显示输出

       jint* _in = env->GetIntArrayElements(in, 0);
       jint* _out = env->GetIntArrayElements(out, 0);

       Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
       Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);
       cvtColor(mSrc , bgra , CV_BGRA2GRAY);
       env->ReleaseIntArrayElements(in, _in, 0);
       env->ReleaseIntArrayElements(out, _out, 0);

       jint retVal;
       int ret = 1;
       retVal = jint(retVal);
       return retVal;

【问题讨论】:

    标签: opencv android-ndk java-native-interface


    【解决方案1】:

    CV_BGRA2GRAY 期望输出为 CV_8UC1。要生成 BGRA 输出,您可以使用临时图像和 2 次转换:

       Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
       Mat gray(height, width, CV_8UC1);
       Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);
       cvtColor(mSrc , gray , CV_BGRA2GRAY);
       cvtColor(gray , bgra , CV_GRAY2BGRA);
    

    【讨论】:

    • @Alex Cohn 但我想输出为灰度图像,当我将其用作 CV_8UC1 时,它会在 android 设备上显示 4 张图像
    • 当使用 2 转换它给我返回 rgba 图像不是吗?
    • 我不知道你如何显示你的位图;在 Java 中处理 8bpp gray 位图是很有可能的。但通常我们将 32-bot-per-pixel 图像包装在 Android 原生位图中。为此,我使用第二次转换。不,它不会返回 RGBA 图像,因为第二次转换仅使用来自 gray Mat 的灰度信息。它将被 OpenCV 正确地从 8bpp 扩展到 32 bpp。
    • @AlexCohn 但每个案例都有不同吗?就像我们从上面的代码中删除cvtColor 的两行并用bilateralFilter(mSrc, bgra, 5, 5, 50); 替换它然后它也没有显示任何结果,即使它在Visual Studio 上对我有用,为什么会这样,并且每种情况都不同吗?谢谢
    • 我不确定我是否理解您的后续问题,但请注意,任何图像处理之后都是显示结果的 Java 部分。应该调整第二步以正确接受第一步 OpenCV 的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多