我正在使用以下代码克隆我的数组:

aproximatedContours = cloneList(contours);

方法主体:
public static ArrayList<MatOfPoint> cloneList(ArrayList<MatOfPoint> contours) {
    ArrayList<MatOfPoint> clone = new ArrayList<MatOfPoint>(contours.size());
    for(MatOfPoint item: contours)
        clone.add((MatOfPoint) item.clone()); // Line 479
    return clone;
}

但是,即使轮廓和克隆都是ArrayList的类型,并且显然它们的元素都是MatOfPoint的类型,我还是收到以下错误:
08-16 16:34:16.015: W/System.err(21747): java.lang.ClassCastException: org.opencv.core.Mat cannot be cast to org.opencv.core.MatOfPoint
08-16 16:34:16.020: W/System.err(21747):    at com.example.objecttracker.ObjectTracker.cloneList(ObjectTracker.java:469)
08-16 16:34:16.020: W/System.err(21747):    at com.example.objecttracker.ObjectTracker.onCameraFrame(ObjectTracker.java:446)
08-16 16:34:16.020: W/System.err(21747):    at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387)
08-16 16:34:16.020: W/System.err(21747):    at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:321)
08-16 16:34:16.025: W/System.err(21747):    at java.lang.Thread.run(Thread.java:856)

有人知道这里发生了什么吗?

最佳答案

这似乎是 MatOfPoint 中的一个API错误:它从clone继承了其Mat方法,因此,在调用它时,您将得到一个简单的Mat返回(大概只复制了父类(super class)的字段)。 MatOfPoint的总体语义似乎没有明确定义,也没有复制它的机制。

编辑:如果本机对象句柄包含所有必需的数据,则可以使用new MatOfPoint(Mat m)作为副本构造函数。

09-28 01:17