2012-06-09 31 views
7

Open-CV 2.4 Android-Java:Android java OpenCV 2.4 ConvexHull convexdefect

Ho cercato per contorni (elenco dei MatofPoint) come questo:

Imgproc.findContours(roi_mat, contours, hierarchy, cfg.retMode, cfg.apxMode); 

e poi il ConvexHull (ha ad essere un elenco di MatofInt)

for (int k=0; k < contours.size(); k++){ 

    Imgproc.convexHull(contours.get(k), hull.get(k)); 
} 

Il ConvexHull vuole un MatofInt ma esimo e drawcontours vuole un MatofPoint .. Allora cosa fare?

Thx in anticipo ..


Edit: @ OpenCV4Android

for (int k=0; k < contours.size(); k++){ 
    Imgproc.convexHull(contours.get(k), hullInt); 

    for(int j=0; j < hullInt.toList().size(); j++){ 
     hullPointList.add(contours.get(k).toList().get(hullInt.toList().get(j))); 
    } 

    hullPointMat.fromList(hullPointList); 
    hullPoints.add(hullPointMat); 
} 

Imgproc.drawContours(mROI, hullPoints, -1, new Scalar(255,0,0, 255), 1); 

risposta

4

Sembra OpenCV API Java manca un'altra ConvexHull() firma:

convexHull(MatOfPoint points, MatOfPoint hull); 

come è possibile chiamare in C++.

Anche se non abbiamo aggiunto, è necessario creare il scafo in MatOfPoint formato manualmente:

  • uso MatOfPoint::toArray() o MatOfPoint::toList() per ottenere punti di contorno
  • uso MatOfInt::toArray() o MatOfInt::toList() per ottenere i loro indici per lo scafo
  • creare un nuovo Point[] o List<Point> con i punti dello scafo solo
  • convertirlo in MatOfPoint tramite MatOfPoint::fromArray() o MatOfPoint::fromList()
  • chiamata Core.drawContours()
+0

ok thx. ci proverò e ti faccio sapere .. – ddd

+0

beh, l'ho provato in questo modo (modifica in questione): non sono sicuro se è assolutamente giusto perché non ottengo buoni risultati .. il più delle volte ci sono solo un sacco di linee di scafo convesse rosse che attraversano l'immagine .. – ddd

+0

o è questo a causa del findcontour (ho provato un filtro canny e/o soglia e gauss prima di findcontour) – ddd

0

abbiamo bisogno chiaro hullPointList prima del punto elenco aggiuntivo per un contorno

hullPointList .clear(); 
for(int j=0; j < hullInt.toList().size(); j++){ 
     hullPointList.add(contours.get(k).toList().get(hullInt.toList().get(j))); 
    }