[英]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.