我使用以下代码克隆我的数组:
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)
有谁知道这里发生了什么?
答案 0 :(得分:4)
这似乎是MatOfPoint
中的API错误:它从clone
继承了Mat
方法,因此当您调用它时,您将获得简单的Mat
返回(并且可能只复制了超类的字段)。 MatOfPoint
的整体语义似乎没有清晰定义,也没有复制机制。
编辑:如果本机对象句柄包含所有必需的数据,您可以使用new MatOfPoint(Mat m)
作为复制构造函数。
答案 1 :(得分:1)
克隆是一个非常tricky的东西,可能在opencv中没有正确实现
答案 2 :(得分:0)
它看起来像一个库问题,因为MatOfPoint奇怪地依赖于Mat的克隆方法,它将克隆一个不是MatOfPoint的Mat对象。
作为一种解决方法,您可以尝试不依赖于clone()方法,但可以自己显式构建副本(未经测试):
// Use a copy ctor
clone.add(new MatOfPoint(item));