在二值图像中查找轮廓并计算物体数量

3
有人可以帮我解决吗?我有一张二进制图像,我使用分水岭分割进行处理,我的问题是如何在图像中找到轮廓并计算物体数量?
@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;
    }
}

我真的需要关于这个问题的帮助,你能帮我吗?https://dev59.com/q1IH5IYBdhLWcg3wGZC5 - Carlos Diego
1个回答

0

你有没有看过分水岭函数的参考文档?

在将图像传递给函数之前,您必须使用正(>0)索引在图像标记中粗略地勾画所需的区域。因此,每个区域表示为一个或多个连接组件,其像素值为1、2、3等。这些标记可以使用findContours从二进制掩模中检索出来。

所以,在进行分水岭变换之前,显然必须使用findContours。要计算对象数量,首先最好有分割后的对象。因此,您应该在分水岭变换之后进行分割...

只需使用谷歌搜索。有无数的教程和示例可以帮助您实现所需的功能。


我应该做什么,@Piglet?我应该把能够计算这样对象的代码放在哪里?我的源代码正确吗? - MTStuart
我们可以聊天吗,@Piglet? - MTStuart
1
如果你不理解源代码到哪里添加这些函数调用,那么很抱歉,最好先理解你已有的内容,然后再添加更多。阅读所有三个函数的文档,这是每个像样的程序员首先会做的事情。我猜你甚至不理解你在这里做什么,否则调用顺序将是清晰的。从向母亲解释一样注释你的整个代码开始。正在发生什么?你有什么数据?... - Piglet
那么,我现在该怎么办?@小猪 - MTStuart
真的抱歉,我在Android OpenCV方面是新手。@Piglet - MTStuart
那么也许你应该从一些基础开始?只是一个建议... 正如我告诉你的那样,参考资料告诉你,在进行分水岭之前应该执行findcontours,如果你还没有对象,计算对象就没有意义。所以,如果你不是脑残,顺序是相当明显的。所以请去阅读文档。所有的东西都在那里。你只需要阅读并应用所写的内容。如果这太难理解了,那就从简单的东西开始。阅读有关图像处理的书籍。做低级OpenCV教程... - Piglet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接