【问题标题】:OpenCV for Android: Simple example to convert Image to GreyscaleOpenCV for Android:将图像转换为灰度的简单示例
【发布时间】:2013-05-09 05:32:58
【问题描述】:

作为初学者,我只想通过 OpenCV 将位图转换为灰度。我拥有了一切 正在运行,但是一旦我想将图像转换为灰度,它就会崩溃。 任何人都可以帮忙吗?我希望sn-ps足够了,如果没有我可以附上其余的。

部分java文件:

                // convert to opencv structure
                Mat image = new Mat();
                Mat grayimage = new Mat();
                Utils.bitmapToMat(b2, image);

                // call opencv for processing
                grayimage = convertToGray (image);

                // convert back
                Utils.matToBitmap(grayimage, b2);

JNI cpp 文件:

JNIEXPORT jlong JNICALL Java_com_my_sample_MainMenuActivity_convertToGray (JNIEnv*, jobject, jlong addrRGBA)
{
    LOGI("Converting to Gray.");
    Mat *mRGBA  = (Mat*)addrRGBA;

    Mat *_retval_;
    cvtColor(*mRGBA, *_retval_, CV_RGB2GRAY);

    LOGI("Successfully finished Converting to Gray.");
    return (jlong) _retval_;
}

转换图像后,它永远不会成功记录。 似乎位图未正确转换为 Mat。 Bitmap 本身确实存在,我可以在 ImageView 上显示它。 有人知道我(显然)做错了什么吗?

05-14 21:26:27.082: I/native(22394): Converting to Gray.
05-14 21:26:27.082: A/libc(22394): Fatal signal 11 (SIGSEGV) at 0xcd10001d (code=1), thread 22394 (ialabs.mysample)

对不起,如果这个问题在其他地方得到回答,我还没有找到 Mat 的例子, 似乎只是一些带有 IplImage 的东西。

【问题讨论】:

  • This answer 有一个将图像数据传递到本机代码并进行处理的示例。它演示了创建 cv::Mat 对象的正确方法,这是您的主要问题之一。
  • 是的,你是对的,只是忘记传递地址,而不是对象本身。谢谢!

标签: android opencv java-native-interface


【解决方案1】:

最简单的方法:

public static Bitmap edgesim(Bitmap first) {

    Bitmap image1;

    ///////////////transform back to Mat to be able to get Canny images//////////////////
    Mat img1=new Mat();
    Utils.bitmapToMat(first,img1);

    //mat gray img1 holder
    Mat imageGray1 = new Mat();

    //mat canny image
    Mat imageCny1 = new Mat();

    //mat canny image
    Mat imageCny2 = new Mat();

    /////////////////////////////////////////////////////////////////

    //Convert img1 into gray image
    Imgproc.cvtColor(img1, imageGray1, Imgproc.COLOR_BGR2GRAY);

    //Canny Edge Detection
    Imgproc.Canny(imageGray1, imageCny1, 10, 100, 3, true);

    ///////////////////////////////////////////////////////////////////

    //////////////////Transform Canny to Bitmap/////////////////////////////////////////
    image1= Bitmap.createBitmap(imageCny1.cols(), imageCny1.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(imageCny1, image1);

    return image1;
}

【讨论】:

    【解决方案2】:

    您有两个空的Mat 对象。您无法将空的内容转换为灰色。

    试试这个:

    Mat tmp = new Mat (b.getWidth(), b.getHeight(), CvType.CV_8UC1);
    Utils.bitmapToMat(b, tmp);
    Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY);
    

    b 是您作为Bitmap 的图像。

    Utils.matToBitmap(tmp, b);
    

    添加此项可将Mat 对象转换回Bitmap

    【讨论】:

    • 实用提示:根据您的源图像(我的来自 ARCore 的相机),您可能需要更改您使用的 Imgproc.COLOR_XXX2GRAY。 ARCore 需要这种转换:Imgproc.COLOR_YUV420sp2GRAY
    【解决方案3】:

    简单错误:

    convertToGray (image.getNativeObjAddr());
    

    是正确的。

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 2013-04-26
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2019-10-16
      • 2013-01-03
      相关资源
      最近更新 更多