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;
}
}
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
Können wir @Piglet chatten? – MTStuart
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