2017-07-31 2 views
0

Comment puis-je dessiner des contours sur un objet noir uniquement et remplir tout le reste en arrière-plan en blanc? Mon code est actuellement en mesure de dessiner les contours sur une image:Android, OpenCV: Détecter les couleurs et dessiner des contours

Bitmap b = BitmapFactory.decodeByteArray(getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length); 
srcMat= new Mat(); 
Utils.bitmapToMat(b,srcMat); 

Mat gray = new Mat(); 
Imgproc.cvtColor(srcMat, gray, Imgproc.COLOR_RGBA2GRAY); 

Imgproc.Canny(gray, gray, 20, 20*3, 3, true); 
List<MatOfPoint> contours = new ArrayList<>(); 
Mat hierarchy = new Mat(); 

Imgproc.findContours(gray,contours,hierarchy,Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) { 
    Imgproc.drawContours(srcMat, contours, contourIdx, new Scalar(0, 0, 255), -1); 
} 

Utils.matToBitmap(gray, b); 
imgR.setImageBitmap(b); 
+0

Vous voulez créer masque de l'image en créant un contour ou quel autre type de contour dont vous parlez ici S'il vous plaît fournir une sortie que vous essayez d'atteindre. – arqam

Répondre

1

Vous devez créer et appliquer le masque, comme en réponse à this question. Vous pouvez le faire, par exemple, de cette façon (insérer le code ci-dessous après votre Imgproc.findContours() appel au lieu de for (int contourIdx = ...:

// create Mat for mask 
Mat mask = new Mat(new Size(srcMat.cols(), srcMat.rows()), CvType.CV_8UC1); 
mask.setTo(new Scalar(0.0)); 

// create Scalar for color of mask objects 
Scalar white = new Scalar(255, 255, 255); 

// draw contours border and fill them 
Imgproc.drawContours(mask, contours, -1, white, 10); 
for (MatOfPoint contour: contours) { 
    Imgproc.fillPoly(mask, Arrays.asList(contour), white); 
} 

// create mat foe masked image 
Mat masked = new Mat(); 

// apply mask to srcMat and set result to masked 
srcMat.copyTo(masked, mask); 

Puis changer gray tapis dans Utils.matToBitmap() appel à masked:

Utils.matToBitmap(masked, b); 
imgR.setImageBitmap(b);