2012-06-30 10 views
31

Próbuję zaimplementować przykładowy kod następującej question przy użyciu apletu opencv java. Aby zaimplementować findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); w języku java, użyłem tej składni Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);.Jak przekonwertować MatOfPoint na MatOfPoint2f w opencv java api

Teraz kontury powinny być teraz List<MatOfPoint> contours = new ArrayList<MatOfPoint>();, a nie vector<vector<cv::Point> > contours;.

Następnie potrzebuję wdrożyć to approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);. W java api Imgproc.approxPolyDP przyjmuje argument jako approxPolyDP(MatOfPoint2f curve, MatOfPoint2f approxCurve, double epsilon, boolean closed). Jak mogę przekonwertować MatOfPoint na MatOfPoint2f?

Czy istnieje sposób użycia wektorów tak samo, jak interfejs C++ do zaimplementowania tego. Każda sugestia lub przykładowy kod jest bardzo doceniany.

Odpowiedz

32

MatOfPoint2f różni się od MatOfPoint tylko typem elementów (odpowiednio float 32-bitowy i 32-bitowy). Opcją realną (choć z karą za wydajność) jest utworzenie instancji MatOfPoint2f i ustawienie jej elementów (w pętli) na równe elementy źródłowego MatOfPoint.

Istnieje

public void fromArray(Point... lp); 
public Point[] toArray(); 

metody w obu klasach.

Więc można zrobić tylko

/// Source variable 
MatOfPoint SrcMtx; 

/// New variable 
MatOfPoint2f NewMtx = new MatOfPoint2f(SrcMtx.toArray()); 
30

uświadamiam sobie to pytanie została już dobrze odpowiedział, ale dodać alternatywę dla każdego, kto znajdzie się w przyszłości -

Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 

for(int i=0;i<contours.size();i++){ 
    //Convert contours(i) from MatOfPoint to MatOfPoint2f 
    contours.get(i).convertTo(mMOP2f1, CvType.CV_32FC2); 
    //Processing on mMOP2f1 which is in type MatOfPoint2f 
    Imgproc.approxPolyDP(mMOP2f1, mMOP2f2, approxDistance, true); 
    //Convert back to MatOfPoint and put the new values back into the contours list 
    mMOP2f2.convertTo(contours.get(i), CvType.CV_32S); 
} 
+2

Skąd pochodzi mMOP2f2? – user2534365

13

Chociaż to pytanie już otrzymałem odpowiedź, uważam, że przyjęta odpowiedź nie jest najlepsza. Konwersja matrycy do macierzy, a następnie powrót, wiąże się z dość wysoką wydajnością, zarówno pod względem czasu, jak i pamięci.

Zamiast tego OpenCV ma już funkcję, która wykonuje dokładnie to: convertTo.

MatOfPoint src; 
// initialize src 
MatOfPoint2f dst = new MatOfPoint2f(); 
src.convertTo(dst, CvType.CV_32F); 

Okazało się, że jest znacznie szybszy i bardziej przyjazny dla pamięci.

Aby przekonwertować MatOfPoint2f na MatOfPoint, należy zamiast tego użyć CvType.CV_32S.

Powiązane problemy