java - Opencv Android 中的分水岭

标签 java android opencv android-ndk

我试图在 Android 上从 OpenCV 实现分水岭功能。但是我的程序总是在调用分水岭函数的地方崩溃。我可以完美地输出标记的结果。但是分水岭函数总是崩溃。这是我的代码:

         Mat threeChannel = new Mat();
         Imgproc.cvtColor(mRgba, threeChannel, Imgproc.COLOR_BGR2GRAY);
         Imgproc.threshold(threeChannel, threeChannel, 100, 255, Imgproc.THRESH_BINARY);

         Mat fg = new Mat(mRgba.size(),CvType.CV_8U);
         Imgproc.erode(threeChannel,fg,new Mat(),new Point(-1,-1),2);

         Mat bg = new Mat(mRgba.size(),CvType.CV_8U);
         Imgproc.dilate(threeChannel,bg,new Mat(),new Point(-1,-1),3);
         Imgproc.threshold(bg,bg,1, 128,Imgproc.THRESH_BINARY_INV);

         Mat markers = new Mat(mRgba.size(),CvType.CV_8U, new Scalar(0));
         Core.add(fg, bg, markers);

         WatershedSegmenter segmenter = new WatershedSegmenter();
         segmenter.setMarkers(markers);
         Mat result = segmenter.process(mRgba);

         return result;

WatershedSegmenter 类如下:

public class WatershedSegmenter{
    public Mat markers;

    public void setMarkers(Mat markerImage)
    {
        markerImage.convertTo(markers, CvType.CV_32S);
    }

    public Mat process(Mat image)
    {
        Imgproc.watershed(image, markers);
        markers.convertTo(markers,CvType.CV_8U);
        return markers;
    }
}

以前有没有人设法让这个在 Android 上运行?在学习本教程之前,我设法让它在 C++ 中与 Qt 一起工作:link .然而,我目前在 Android 上还没有任何运气。

最佳答案

我现在找到崩溃的原因了。分水岭取的是8位3 channel 格式的数据,而RGBA是4 channel 数据。我只是将它从 RGBA 转换为 RGB,它解决了所有问题。

关于java - Opencv Android 中的分水岭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273161/

相关文章:

java - 数组内部格式化

android - 在 Android 中查找 View ID

c++ - OpenCV:projectPoints 可以返回负值吗?

android - imageview 设置选择器文件以编程方式使用无效。 (安卓)

c++ - opencv检测到多个小圆圈,但没有检测到更大的圆圈

python-2.7 - Python Ocr车牌识别

java - 如何最好地从现有 PNG 生成图像?

java - Appengine JPA 更新

java - 远程网络服务

android - 在 Android 开发人员中找不到完整 Android 示例的链接