OpenCV for Android:将图像转换为灰度的简单示例
作为初学者,我只想通过OpenCV将位图转换为灰度。我什么都有 正在运行,但当我想将图像转换为灰度时,它就会崩溃。 有人能帮忙吗?我希望这些片段足够了,如果没有,我可以附上其余的 java文件的一部分:OpenCV for Android:将图像转换为灰度的简单示例,android,opencv,java-native-interface,Android,Opencv,Java Native Interface,作为初学者,我只想通过OpenCV将位图转换为灰度。我什么都有 正在运行,但当我想将图像转换为灰度时,它就会崩溃。 有人能帮忙吗?我希望这些片段足够了,如果没有,我可以附上其余的 java文件的一部分: // convert to opencv structure Mat image = new Mat(); Mat grayimage = new Mat(); Uti
// 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)
很抱歉,如果这个问题在其他地方得到了回答,我还没有找到Mat的示例,
似乎只是一些带有IplImage的。简单错误:
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
是作为位图的图像
Utils.matToBitmap(tmp, b);
添加此选项可将Mat
对象转换回Bitmap
最简单的方法:
Utils.matToBitmap(tmp, b);
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;
}
有一个将图像数据传递到本机代码并进行处理的示例。它演示了创建cv::Mat
对象的正确方法,这是您的主要问题之一。是的,您是正确的,只是忘记传递地址,而不是对象本身。谢谢有用提示:根据您的源图像(我的源图像来自ARCore的相机),您可能需要更改您使用的Imgproc.colorxxx2;灰色。ARCore需要此转换:Imgproc.COLOR\u YUV420sp2GRAY