我正在Lua进行深度学习任务,我需要从C ++将图像流导入Lua。 C ++脚本从共享内存中读取数据,我有指向C ++中图像的指针。我想在Lua中得到这个指针并将图像流提供给我的神经网络
由于Lua不使用指针,因此我的研究方法是将此指针包装到userdata和write accessor方法中。正如本User Data With Pointer Example中所述
我的问题是我需要用原始像素数据提供神经网络,到目前为止,网上可用的资料表明,数据处理应该用C ++完成,而且无法直接在Lua中获取该对象。
这里应该采用什么正确的方法?如何从C ++中的指针获取Lua中的对象值?
答案 0 :(得分:2)
好吧,你必须以某些的方式让Lua可以访问数据。
我可以想到四种一般方法:
转换数据
(我不会在这里再说这些选项。)
将其作为userdata传递并编写访问器函数,因此您可以用Lua而不是C(++)编写转换代码
(仅用于无指针数据,图像通常是这样)将原始数据区域作为字符串传递给Lua
(仅限LuaJIT)使用ffi.cdef
声明与内存格式匹配的C struct
以进行免费访问&转换(int,float,无所谓 - 也可以使用指针)
(2)基本上只是(1a),大部分代码都转移到了Lua端。
(3)与免费访问代码(string.byte
( data, i[, j])
以及5.3中新添加的其他代码相同:string.unpack
(
fmt
{{1 }})。
在决定其中一种方法之前,先看看对方想要的格式。
也许您的数据已经采用该格式,在这种情况下,您只需要以某种方式路由指针。 (也许有一个接受Lua表的函数,但也许还有一个接受字符串或指向原始图像数据的指针。)如果这适用,请使用(轻)用户数据或字符串进行通信。 (这可能是最快的,如果这种传递数据的方式不存在,请考虑询问上游是否可以添加数据。)
如果做不到这一点,您将不得不实际触摸数据。字符串版本可能是最简单的,但也可能是最慢的。 (如果数据是一个连续的字节块,您可以简单地lua_pushlstring
, data[, startpos] )
将所有内容放入Lua中,但这会创建一个Lua状态内部“字符串”的副本,这可能相对较慢。)之后,你可以使用Lua的standard string handling functionality。
如果你正在使用LuaJIT,那么使用ffi
库可能是一个非常好的主意。您可能需要的简要概述(使用链接列表作为示例):
( L, ptr, len_in_bytes )
最后,如果您使用的是vanilla Lua,您可能需要使用(完整的)userdata和手动编写的访问器来避免数据复制造成的速度损失。 (完整的userdata是必需的,因此您可以设置metatable来获取访问者,但它可以只是指向外部分配数据的指针。)“Lua编程”一书有很好的信息(第一版在线,{ {3}}。)