2016-05-09 4 views
3

Jemand kann mir helfen, es zu lösen? Ich habe ein Binärbild, das ich mit Watershed Segmentierung ausgeführt habe. Mein Problem ist, wie finde ich Contours und CountObject im Bild?FindContours und CountObject in Binär Image

@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; 
    } 
} 

Antwort

0

Haben Sie die Referenzdokumentation der Wasserscheidenfunktion gelesen?

Bevor das Bild auf die Funktion vorbei, haben Sie etwa die gewünschten Regionen in den Bildmarken mit positiv (> 0) Indizes skizzieren. So wird jede Region als eine oder mehrere verbundene Komponenten mit den Pixelwerten 1, 2, 3 und so weiter dargestellt. Solche Marker können aus einer binären Maske findContours

So nutzen zu können muss offensichtlich findContours mit abgerufen werden vor dem Sie die Wende verwandeln kann. Um Ihre Objekte zu zählen, wäre es offensichtlich sinnvoll, in erster Linie segmentierte Objekte zu haben. Also sollten Sie das wahrscheinlich nach der Wasserscheide verwandeln ...

Verwenden Sie einfach google. Es gibt unzählige Tutorials und Beispiele, wie Sie erreichen können, was Sie wollen.

+0

was soll ich tun @ Piglet? Wo muss ich den Code platzieren, der das Objekt so zählen kann? ist es richtig, mein Quellcode oben? – MTStuart

+0

Können wir @Piglet chatten? – MTStuart

+1

Entschuldigung, wenn Sie Ihren Quellcode nicht gut genug verstehen, um zu wissen, wo Sie diese Funktionsaufrufe hinzufügen können, beginnen Sie besser mit dem, was Sie bereits haben, bevor Sie weitere hinzufügen ... Lesen Sie die Dokumentation zu allen 3 Funktionen. Das würde jeder vernünftige Programmierer zuerst tun. Ich nehme an, Sie verstehen nicht einmal, was Sie hier tun, sonst wäre die Reihenfolge der Anrufe klar. Beginnen Sie damit, Ihren gesamten Code zu kommentieren, so wie Sie es Ihrer Mutter erklären würden. Was ist los? Welche Daten haben Sie? ... – Piglet