【问题标题】:FindContours and CountObject in Binary Image二进制图像中的 FindContours 和 CountObject
【发布时间】:2016-09-03 13:01:20
【问题描述】:

有人可以帮我解决吗?我有一个使用分水岭分割处理的二进制图像,我的问题是,如何在图像中找到轮廓和计数对象?

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        ImageView imageView = (ImageView) findViewById(R.id.imgView);
        Bitmap bmp=BitmapFactory.decodeFile(picturePath);
          Log.i(TAG, picturePath);
         Mat img=Highgui.imread(picturePath);
        //Mat img=Imgcodecs.imread(picturePath);
        Mat result=new Mat();
        //Utils.bitmapToMat(bmp, img);
        //Imgproc.cvtColor(img,result,Imgproc.COLOR_BGRA2BGR);
         result=steptowatershed(img);
        //Imgproc.cvtColor(result, img,Imgproc.COLOR_BGR2BGRA,4);
        Utils.matToBitmap(result, bmp, true);
          Log.i(TAG, "all okay");
        imageView.setImageBitmap(bmp);

    }        
}
//in here i must place that code for findContours and Count object ? or where ?

public Mat steptowatershed(Mat img)
{
    Mat threeChannel = new Mat();

    Imgproc.cvtColor(img, threeChannel, Imgproc.COLOR_BGR2GRAY);
    Imgproc.threshold(threeChannel, threeChannel, 100, 255, Imgproc.THRESH_BINARY);

    Mat fg = new Mat(img.size(),CvType.CV_8U);
    Imgproc.erode(threeChannel,fg,new Mat());

    Mat bg = new Mat(img.size(),CvType.CV_8U);
    Imgproc.dilate(threeChannel,bg,new Mat());
    Imgproc.threshold(bg,bg,1, 128,Imgproc.THRESH_BINARY_INV);

    Mat markers = new Mat(img.size(),CvType.CV_8U, new Scalar(0));
    Core.add(fg, bg, markers);
    Mat result1=new Mat();
    WatershedSegmenter segmenter = new WatershedSegmenter();

    segmenter.setMarkers(markers);
    result1 = segmenter.process(img);
    return result1;
    //in here i must place that code for findContours and Count object ? or where ?
}

public class WatershedSegmenter
{
    public Mat markers=new Mat();
    public void setMarkers(Mat markerImage)
    {

        markerImage.convertTo(markers, CvType.CV_32SC1);
    }

    //in here i must place that code for findContours and Count object ? or where ?
    public Mat process(Mat image)
    {
        Imgproc.watershed(image,markers);
        markers.convertTo(markers,CvType.CV_8U);

        return markers;
    }
}

【问题讨论】:

标签: android opencv image-processing watershed


【解决方案1】:

你有没有阅读分水岭函数的参考文档?

在将图像传递给函数之前,您必须大致勾勒出轮廓 图像标记中具有正(> 0)索引的所需区域。 因此,每个区域都表示为一个或多个连通分量 像素值为 1、2、3 等。这样的标记可以是 使用 findContours

从二进制掩码中检索

因此,在进行分水岭变换之前,您显然必须使用 findContours。 要计算您的对象,显然首先将对象分段是有意义的。 所以你最有可能在分水岭变换之后这样做......

只需使用谷歌。有无数教程和示例说明如何实现您想要的。

【讨论】:

  • 我应该做什么@Piglet?我必须在哪里放置可以像这样计算对象的代码?我上面的源代码对吗?
  • 我们可以聊聊@Piglet 吗?
  • 抱歉,如果您对源代码的理解不够好,无法知道在哪里添加这些函数调用,您最好先了解您已有的内容,然后再添加更多... 阅读文档在所有 3 个功能上。这是每个体面的程序员首先要做的事情。我假设你甚至不明白你在这里做什么,否则调用的顺序会很清楚。从注释您的整个代码开始,就像您向母亲解释它一样。到底是怎么回事?你有什么数据?...
  • 那么,我现在该怎么办? @小猪
  • 真的很抱歉,我是 Android OpenCV @Piglet 的新手
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 2011-02-22
  • 2018-03-18
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多