2012-06-30 37 views
31

Tôi đang cố gắng triển khai mã ví dụ sau đây question bằng cách sử dụng apencv java api. Để thực hiện findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); trong java tôi đã sử dụng cú pháp này Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);.Cách chuyển đổi MatOfPoint thành MatOfPoint2f trong opencv java api

Vì vậy, các đường bao giờ phải là List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); thay vì vector<vector<cv::Point> > contours;.

Sau đó, tôi cần triển khai thực hiện approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true); này. Trong java api, Imgproc.approxPolyDP chấp nhận đối số là approxPolyDP(MatOfPoint2f curve, MatOfPoint2f approxCurve, double epsilon, boolean closed). Làm thế nào tôi có thể chuyển đổi MatOfPoint thành MatOfPoint2f?

Hoặc có cách nào để sử dụng vectơ giống như giao diện C++ để thực hiện điều này không. Bất kỳ đề nghị hoặc mã mẫu được đánh giá cao.

Trả lời

32

MatOfPoint2f khác với MatOfPoint chỉ trong loại phần tử (phao 32 bit và int 32 bit). Tùy chọn khả thi (mặc dù với một hình phạt hiệu suất) là tạo ra cá thể MatOfPoint2f và thiết lập các phần tử của nó (trong một vòng lặp) bằng với các phần tử của nguồn MatOfPoint.

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

phương pháp trong cả hai lớp.

Vì vậy, bạn có thể làm chỉ

/// Source variable 
MatOfPoint SrcMtx; 

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

Tôi nhận ra câu hỏi này đã được trả lời tốt, nhưng để thêm một sự lựa chọn cho những ai tìm thấy nó trong tương lai -

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 đến từ đâu? – user2534365

13

Mặc dù câu hỏi này đã được trả lời, tôi tin rằng câu trả lời được chấp nhận không phải là tốt nhất. Chuyển đổi một ma trận thành một mảng và sau đó quay trở lại với hình phạt khá hiệu quả, cả về thời gian và trí tuệ.

Thay vào đó, OpenCV đã có một chức năng thực hiện chính xác việc này: convertTo.

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

Tôi nhận thấy điều này nhanh hơn và thân thiện với bộ nhớ hơn.

Để chuyển đổi MatOfPoint2f thành MatOfPoint, hãy sử dụng CvType.CV_32S thay thế.

Các vấn đề liên quan