Java 无法克隆ArrayList<;MatOfPoint>;元素

Java 无法克隆ArrayList<;MatOfPoint>;元素,java,android,opencv,arraylist,clone,Java,Android,Opencv,Arraylist,Clone,我正在使用以下代码克隆阵列: aproximatedContours = cloneList(contours); 方法主体: public static ArrayList<MatOfPoint> cloneList(ArrayList<MatOfPoint> contours) { ArrayList<MatOfPoint> clone = new ArrayList<MatOfPoint>(contours.size());

我正在使用以下代码克隆阵列:

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;
}

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

这似乎是一个API错误:它从
Mat
继承了它的
clone
方法,所以当你调用它时,你会得到一个简单的
Mat
返回(大概只复制了超类的字段)。
MatOfPoint
的整体语义似乎没有明确定义,也没有复制语义的机制


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

克隆是一件非常重要的事情,在opencv中可能没有正确实现。这看起来像是一个库问题,因为MatoPoint奇怪地依赖Mat的克隆方法,该方法将克隆一个不是MatoPoint的Mat对象

作为一种解决方法,您可以尝试不依赖clone()方法,而是显式地自行构建副本(未经测试):


根据您的请求进行更新可能是最好的方法,但是您需要检查源代码,看看它是否能正确地与
MatOfPoint
实例一起工作。在使用OpenCV for android时,我遇到了很多麻烦。有没有其他好的简历库?你确定这是一个bug?您还可以检查一下我的悬赏问题:@Marek请不要使用注释来问更多的问题。这是一个错误,因为类不应该实现
clone()
,除非它是
final
,并且
Mat
也不实现
Cloneable
接口。@Marek我没有说它没有帮助。我只是建议您查看源代码以确认-您是否这样做了?不工作-MatOfPoint具有相同的引用,因此当我更改克隆元素时,列表元素也会更改…您可以尝试深度克隆值。可能类似于new clone.add(new MatOfPoint(item.toArray());
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)
    // Use a copy ctor
    clone.add(new MatOfPoint(item));