繁体   English   中英

按值而非参考复制[JavaCV-框架]

[英]Copy by value and not by reference [JavaCV - Frame]

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

由于我没有访问既不对象框,或图像采集卡,我不能让“时间可复制可序列化 因此,没有复制。

我相信,由于我们每轮创建了一个新的对象框架,因此我们会得到一个新的参考,正确吗?

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


    }
}

从jar文件从javaCV实现类。

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

我可以克隆图像,给我一个新的参考。 但是,图像中的内容似乎仍然相同。 因此,这仍然不是深层副本。也将尝试序列化。

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

可能会有所帮助

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM