3

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

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)

有谁知道这里发生了什么?

4

3 回答 3

4

这似乎是一个 API 错误MatOfPoint:它从 继承其clone方法Mat,因此当您调用它时,您会得到一个简单的Mat返回(并且可能只复制了超类的字段)。的整体语义MatOfPoint似乎没有明确定义,并且没有复制的机制。

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

于 2013-08-16T07:42:36.457 回答
1

克隆是一件非常棘手的事情,可能在 opencv 中没有正确实现

于 2013-08-16T07:46:14.997 回答
0

它看起来像一个库问题,因为 MatOfPoint 奇怪地依赖于 Mat 的 clone 方法,该方法将克隆一个不是 MatOfPoint 的 Mat 对象。

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

    // Use a copy ctor
    clone.add(new MatOfPoint(item));
于 2013-08-16T07:54:01.713 回答