加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Opencv Android中的分水岭

发布时间:2020-12-15 04:14:22 所属栏目:Java 来源:网络整理
导读:我试图在 Android上实现OpenCV的分水岭功能.但是我的程序总是在调用分水岭功能的地方坠毁.我可以完美地输出标记的结果.但是分水岭功能总是崩溃.这是我的代码: Mat threeChannel = new Mat(); Imgproc.cvtColor(mRgba,threeChannel,Imgproc.COLOR_BGR2GRAY);
我试图在 Android上实现OpenCV的分水岭功能.但是我的程序总是在调用分水岭功能的地方坠毁.我可以完美地输出标记的结果.但是分水岭功能总是崩溃.这是我的代码:

Mat threeChannel = new Mat();
         Imgproc.cvtColor(mRgba,threeChannel,Imgproc.COLOR_BGR2GRAY);
         Imgproc.threshold(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,3);
         Imgproc.threshold(bg,1,128,Imgproc.THRESH_BINARY_INV);

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

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

         return result;

WatershedSegmenter calss如下:

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上运行?在使用本教程之前,我设法让它在Q中使用Qt:link.但是我目前在Android上没有运气.

解决方法

我现在发现了崩溃的原因.分水岭采用8位3通道数据格式,RGBA采用4通道数据.我只是将它从RGBA转换为RGB,它解决了所有问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读