2012-06-09 8 views
7

Abrir-CV 2.4 de Android en Java:java androide OpenCV 2.4 ConvexHull convexdefect

he buscado contornos (lista de MatofPoint) como este:

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

y luego el ConvexHull (tiene a ser una lista de MatofInt)

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

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

El ConvexHull quiere un MatofInt pero º e drawcontours quiere un MatofPoint ... Entonces, ¿qué hacer?

Thx de antemano ..


Editar: @ 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); 

Respuesta

4

Parece que la API de Java OpenCV carece de otra ConvexHull() Firma:

convexHull(MatOfPoint points, MatOfPoint hull); 

como es posible llamar a C++.

Aunque no hemos añadido, es necesario para crear el casco en MatOfPoint formato manualmente:

  • uso MatOfPoint::toArray() o MatOfPoint::toList() para obtener puntos de contorno
  • uso MatOfInt::toArray() o MatOfInt::toList() para obtener sus índices para el casco
  • crear un nuevo Point[] o con los puntos del casco solamente
  • convertirlo a través MatOfPointMatOfPoint::fromArray() o MatOfPoint::fromList()
  • llamada Core.drawContours()
+0

bien THX. Voy a intentarlo y dejarte saber .. – ddd

+0

Bueno, lo he intentado así (edición en cuestión): No estoy seguro de si es totalmente correcto porque no obtengo buenos resultados ... la mayoría del tiempo hay solo un montón de líneas de casco rojo convexo que cruzan el img .. – ddd

+0

o es esto debido a la findcontour (intenté un filtro canny yo umbral y gauss antes de encontrarcontour) – ddd

0

necesitamos hullPointList clara antes del punto de la lista de complemento para un contorno

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