2012-06-30 71 views
31

我試圖通過使用opencv java api來實現以下示例代碼 question 。爲了在java中實現findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);,我使用了這個語法Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);如何在OpenCV java api中將MatOfPoint轉換爲MatOfPoint2f

所以現在等高線應該是List<MatOfPoint> contours = new ArrayList<MatOfPoint>();而不是vector<vector<cv::Point> > contours;

然後我需要實現這個approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);。在java api中,Imgproc.approxPolyDP接受參數爲approxPolyDP(MatOfPoint2f curve, MatOfPoint2f approxCurve, double epsilon, boolean closed)。我如何將MatOfPoint轉換爲MatOfPoint2f?

或者有沒有辦法像C++接口一樣使用向量來實現這一點。任何建議或示例代碼非常感謝。

回答

32

MatOfPoint2f僅在元素類型(分別爲32位浮點型和32位int型)中與MatOfPoint不同。可行的選項(儘管有性能損失)是創建MatOfPoint2f實例並將其元素(在循環中)設置爲等於源MatOfPoint的元素。

有兩個班的

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

方法。

所以,你可以做到這

/// Source variable 
MatOfPoint SrcMtx; 

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

我意識到這個問題已經得到了很好的回答,但要加的人誰發現它在未來的一個選擇 -

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

mMOP2f2從哪裏來? – user2534365

13

雖然這個問題已經回答了,我相信接受的答案不是最好的。將一個矩陣轉換爲一個數組,然後回來會帶來相當的性能損失,無論是在時間上還是在存儲方面。

相反,OpenCV已經有一個功能,它完全做到這一點:convertTo。

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

我發現這顯然更快,更符合內存。

要將MatOfPoint2f轉換爲MatOfPoint,請改爲使用CvType.CV_32S。