刚刚获得了Project Tango开发套件平板电脑,并完成了一些演示和示例.
一些较旧的博客文章使用应该预装在设备上的"Tango Mapper"应用程序中的日志文件.
不幸的是,"Tango Mapper"应用程序没有预先加载到我的设备上,我似乎无法在Play商店中找到它.
是否有其他方法可以简单地导出或检索PointCloud数据以进行下游渲染?
[型号:黄石,Tango核心版本:1.1:2014.11.14-bernoulli-release]
区域学习是Google Tango的一个关键特性,它允许Tango设备在已知环境中定位并保存/加载地图文件(ADF).
从那以后谷歌宣布它正在关闭Tango并将其努力投入到ARCore中,但我没有看到任何与ARCore文档中的区域学习有关的内容.
Android上的区域学习的未来是什么?是否有可能在非Tango/ARCore设备上实现这一目标?
android augmented-reality google-project-tango android-augmented-reality arcore
问: 有没有人知道如何使用Tango Java(Jacobi)API onFrameAvailable()
回调获取Tango的彩色相机图像缓冲区?
背景:
我有一个增强现实应用程序,在Tango的背景中显示视频.我在此示例后使用Java API(Jacobi)成功创建了视频叠加示例.我的应用程序工作正常,视频在后台正确呈现.
作为应用程序的一部分,我想在用户按下按钮时存储视频后备缓冲区的副本.因此,我需要访问相机的RGB数据.
根据Jacobi发行说明,任何希望访问相机RGB数据的类都应该实现新的onFrameAvailable()
方法OnTangoUpdateListener
.我做了这个,但我没有看到任何实际获取像素的句柄或参数:
Java API
@Override
public void onFrameAvailable(int cameraId) {
//Log.w(TAG, "Frame available!");
if (cameraId == TangoCameraIntrinsics.TANGO_CAMERA_COLOR) {
tangoCameraPreview.onFrameAvailable();
}
}
Run Code Online (Sandbox Code Playgroud)
如图所示,onFrameAvailable
只有一个参数,整数表示生成视图的摄像机的id.将其与C库回调进行对比,后者提供对图像缓冲区的访问:
C API
TangoErrorType TangoService_connectOnFrameAvailable(
TangoCameraId id, void* context,
void (*onFrameAvailable)(void* context, TangoCameraId id,
const TangoImageBuffer* buffer));
Run Code Online (Sandbox Code Playgroud)
我期待Java方法在C API调用中有类似于缓冲区对象的东西.
我试过的
我尝试扩展TangoCameraPreview
课程并将图像保存在那里,但我只获得黑色背景.
public class CameraSurfaceView extends TangoCameraPreview {
private boolean takeSnapShot = false;
public void takeSnapShot() {
takeSnapShot …
Run Code Online (Sandbox Code Playgroud) 我看到onPoseAvailable()
回调和回调的姿势之间存在显着差异Tango.getPoseAtTime()
.我写了一个测试程序,在那里onPoseAvailable()
我记录了传递的姿势并用于getPoseAtTime()
使用之前2个回调的时间戳来请求姿势.KEY_BOOLEAN_SMOOTH_POSE
已配置false
.这是执行该操作的代码(timestamps_
成员变量是a LinkedList<Double>
):
@Override
public void onPoseAvailable(TangoPoseData poseData) {
if (poseData != null && poseData.statusCode == TangoPoseData.POSE_VALID) {
Log.v("bug",
String.format("onPoseAvailable t: %f, base: %d, target %d, p: (%f, %f, %f)",
poseData.timestamp,
poseData.baseFrame,
poseData.targetFrame,
poseData.translation[0], poseData.translation[1], poseData.translation[2]));
timestamps_.add(poseData.timestamp);
if (timestamps_.size() > 3)
timestamps_.remove();
}
if (timestamps_.isEmpty())
return;
TangoCoordinateFramePair framePair = new TangoCoordinateFramePair(
TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
TangoPoseData.COORDINATE_FRAME_DEVICE);
poseData = tango_.getPoseAtTime(timestamps_.getFirst(), framePair);
if (poseData != null && poseData.statusCode == TangoPoseData.POSE_VALID) { …
Run Code Online (Sandbox Code Playgroud) 该项目探戈C API文档说,TANGO_CALIBRATION_POLYNOMIAL_3_PARAMETERS
镜头失真建模为:
x_corr_px = x_px(1 + k1*r2 + k2*r4 + k3*r6)y_corr_px = y_px(1 + k1*r2 + k2*r4 + k3*r6)
也就是说,无失真的坐标是一个幂级数功能扭曲的坐标.Java API中还有另一个定义,但该描述不够详细,无法确定函数映射的方向.
我在使事情正确注册方面遇到了很多麻烦,我怀疑映射实际上可能是相反的方向,即失真的坐标是未失真坐标的幂级数.如果摄像机校准是使用OpenCV生成的,那么问题的原因可能是OpenCV文档与自身相矛盾.最容易找到和理解的描述是OpenCV摄像机校准教程,它与Project Tango文档一致:
但另一方面,OpenCV API文档指定映射采用另一种方式:
我在OpenCV上的实验表明它的API文档看起来是正确的并且教程是错误的.正k1
(所有其他失真参数设置为零)表示枕形失真,负k1
表示桶形失真.这与维基百科关于布朗康拉迪模型的说法相符,并且与Tsai模型相反.请注意,失真可以通过任何方式建模,具体取决于使数学更方便的原因.我针对这种不匹配打开了一个针对OpenCV 的错误.
所以我的问题是:Project Tango镜头失真模型是否与OpenCV中实现的相同(尽管文档)?
这是我从彩色相机拍摄的图像(可以看到轻微的枕形):
以下是Tango服务报告的相机校准:
distortion = {double[5]@3402}
[0] = 0.23019999265670776
[1] = -0.6723999977111816
[2] = 0.6520439982414246
[3] = 0.0
[4] = 0.0
calibrationType …
Run Code Online (Sandbox Code Playgroud) 我正在开发Tango的AR应用程序.该设备是ZenfoneAR(Android 7.0 Nougat).
我改进了示例项目并开发了一个应用程序.但是,启动应用程序时,将显示以下警告消息.
对话消息
Detected problems with app native libraries(please consult log for detail):
libtango_client_api.so: unauthorized access to "libbinder.so"
libtango_client_api.so: unauthorized access to "libcutils.so"
libtango_client_api.so: unauthorized access to "libutils.so"
libtango_client_api.so: unauthorized access to "libgui.so"
libtango_client_api.so: unauthorized access to "libandroid_runtime.so"
libtango_client_api.so: unauthorized access to "libui.so"
Run Code Online (Sandbox Code Playgroud)
logcat的
W/linker: library "libbinder.so" ("/system/lib64/libbinder.so") needed or dlopened by "/data/data/com.google.tango/libfiles/default/libtango_client_api.so" is not accessible for the namespace "classloader-namespace" - the access is temporarily granted as a workaround for http://b/26394120, note that the access will be removed …
Run Code Online (Sandbox Code Playgroud) 我了解以下报价对于Project Google Tango非常正确:
通过将深度感知与运动跟踪相结合,该设备可以测量不在同一帧中的区域中的点之间的距离。
基于以上内容,以下是一些问题:
1.是否可以像Project Tango那样使用ARCore来测量距离?
2.与Project Google Tango相比,结果的准确性如何?
是什么让支持ARCore 的设备支持 ARCore?哪些功能使该设备支持 ArCore?ARCore 设备和其他不支持的设备有什么区别?
我正在尝试使用 MediaCodec 在 Android 上对 h264 视频进行编码以进行实时视频流,但 dequeueOutputBuffer 持续花费很长时间(实际上它有时非常快,但有时非常慢,请参阅下面的日志输出)。我已经看到它甚至需要 200 毫秒才能准备好输出缓冲区。我的代码有问题吗,或者您认为这是 OMX.Nvidia.h264.encoder 的问题吗?
也许我需要将图像从 1280x720 缩小到更小?或者我可能需要在等待输出缓冲区时将更多输入缓冲区出列和排队?(有 6 个输入和 6 个输出缓冲器可用)。我使用的是 Android API 19,因此无法使用异步 MediaCodec 处理方法。我实际上是从 Google Project Tango 平板电脑流式传输图像,所以我的另一个怀疑是可能 Tango 的后台操作花费的时间太长并导致编码器变慢。关于什么可能会减慢这种速度的任何想法?
01-20 23:36:30.728 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 0.400666ms.
01-20 23:36:30.855 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 94.290667ms.
01-20 23:36:30.880 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 0.57ms.
01-20 23:36:30.929 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 4.878417ms.
01-20 23:36:31.042 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 77.495417ms.
01-20 23:36:31.064 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 0.3225ms.
01-20 23:36:31.182 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 74.777583ms. …
Run Code Online (Sandbox Code Playgroud) encoding android h.264 google-project-tango android-mediacodec