OpenCV for Android:将图像转换为灰度的简单示例

问题描述:

作为初学者,我只是想通过OpenCV将位图转换为灰度。我有一切 运行,但它只要我想要将图像转换为灰度就会崩溃。 任何人都可以帮忙吗?我希望这些片段已经足够,如果不是,我可以附加其余部分。 java文件的OpenCV for Android:将图像转换为灰度的简单示例

部分:

   // 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。 位图本身确实存在,我可以在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) 

很抱歉,如果这个问题是在其他地方说,我还没有发现有垫, 只是一些与IplImage的一个例子,它似乎。

+1

[这个答案](http://*.com/questions/12695232/using-native-functions-in-android-with-opencv/12699835# 12699835)有一个将图像数据传递到本地代码并进行处理的示例。它演示了创建'cv :: Mat'对象的正确方法,这是您的主要问题之一。 – Aurelius

+0

是的,你是正确的,只是忘了传递地址,而不是对象本身。谢谢! – complexM

简单的错误:

convertToGray (image.getNativeObjAddr()); 

是正确的。

您有两个空的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

最简单的方式做到这一点:

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