按值复制而不是按引用复制[JavaCV - Frame]

时间:2015-09-29 10:34:08

标签: java

当我们从FrameGrabber检索帧时,我们得到对帧的引用。 该框架将添加到列表中。但是,由于我们仅引用框架,因此列表中的所有对象都指向相同的引用。

由于我无法访问任何对象框架或FrameGrabber,因此无法创建'em cloneableserializable。因此没有复制。

我相信,既然我们每轮创建一个新的对象框架,我们会得到一个新的参考,rigth?

Frame frame = new Frame();

但是,对象框架本身是对以下内容的引用:

frame = mFrameGrabber.grabFrame();

所以罪魁祸首是mFrameGrabber,它每次都返回相同的引用。帮我解决这个问题。

  

简短:捕获一个帧(对象)并将内容(不是引用)存储在object类型的arraylist中。

private FrameGrabber mFrameGrabber;
List<Frame> frameBuffer = new ArrayList<Frame>();
public void run() {

    // Run forever
    while ( true )
    {
        Frame frame = new Frame();

        // Time to capture a frame ? 
        if ( captureTimer.hasTimerElapsed() == true )
        {
            try 
            {
                // Grab a frame
                frame = mFrameGrabber.grabFrame();

                if ( frameWindow.isVisible() && frame != null) 
                {
                    frameBuffer.add(frame);
                }

            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }


    }
}

类是从java文件中的jar文件实现的。

编辑: 好。框架对象具有对象本身。我注意到我需要复制的唯一对象是buffer []类型的对象。称之为图像。

我可以克隆图片,给我一个新的参考。但是,图像中的内容似乎仍然是相同的lol。所以这仍然不是一个很深的副本..也会尝试序列化。

private Frame copyFrame(Frame frame)
    {
        // Frame that will hold the copy
        Frame cFrame = new Frame(640, 480, 8, 3);
        cFrame.image = frame.image.clone();

        return cFrame;
    }

2 个答案:

答案 0 :(得分:0)

可能会有所帮助

frame = (Frame)mFrameGrabber.grabFrame().clone();

答案 1 :(得分:0)

问题现在已经解决了。查看类/对象“框架”,结论是内部唯一必须被深层复制的组件是:

public Buffer[] image;

在课堂上看一下,可以看到以下内容:

ByteBuffer buffer = ByteBuffer.allocateDirect(imageHeight * imageStride * pixelSize).order(ByteOrder.nativeOrder());
image[0] = buffer;  

因此缓冲区的索引0持有ByteBuffer,这是不可序列化的!于是我开始深入挖掘网络如何深度复制这样的对象。结果很好。

以下是解决方案。谢谢你们的反馈!

private Frame copyFrame(Frame frame)
{
    // Frame that will hold the copy
    Frame cFrame = new Frame(640, 480, 8, 3);

    // Copy the byte buffer from frame
    ByteBuffer originalByteBuffer = (ByteBuffer) frame.image[0];

    // Create the clone buffer with same capacity as the original
    ByteBuffer cloneBuffer = ByteBuffer.allocateDirect(originalByteBuffer.capacity());
    //ByteBuffer cloneBuffer = deepCopy(originalByteBuffer);

    // Save parameters from the original byte buffer
    int position = originalByteBuffer.position();
    int limit = originalByteBuffer.limit();


    // Set range to the entire buffer
    originalByteBuffer.position(0).limit(originalByteBuffer.capacity());

    // Read from original and put into clone
    cloneBuffer.put(originalByteBuffer);

    // Set the order same as original
    cloneBuffer.order(originalByteBuffer.order());

    // Set clone position to 0 and set the range as the original
    cloneBuffer.position(0);
    cloneBuffer.position(position).limit(limit);

    // Save the clone 
    cFrame.image[0] = cloneBuffer;      

    return cFrame;
}