一些前言
传送门
购买考虑
一开始在zed2i和zedmini之间考虑了很久。
- 硬件差异
ZED2i:ZED2i配备了更强大的硬件,支持更高的分辨率和更远的深度感知范围。它使用更先进的传感器,能够提供更准确的深度映射和立体视觉效果,适用于更复杂的应用场景,如自动驾驶、机器人导航等。
ZED Mini:ZED Mini则是一款更紧凑的版本,专为增强现实(AR)和虚拟现实(VR)等应用设计。它体积更小,适合集成到头戴设备或更小型的设备中,虽然深度感知性能比ZED2i略逊一筹,但仍然能够提供高质量的空间映射和定位功能。
- 流媒体传输
ZED2i:它可以通过ZED SDK进行流媒体传输,这意味着它依赖于Stereolabs的ZED SDK来处理视频和深度数据的传输。ZED SDK提供了一套强大的工具,用于捕捉、处理和流式传输数据,支持深度图、点云、轨迹等多种数据格式,并且能够在计算机端进行实时处理。
ZED Mini:ZED Mini则支持通过IP直接流式传输数据(“Stream anywhere over IP”),这意味着它可以通过网络将数据发送到远程设备,而不依赖ZED SDK。这种方式简化了连接和数据传输的复杂度,适合需要远程访问或在分布式系统中使用的场景。
- 应用场景
ZED2i:由于其强大的深度感知能力和更大的视场,它适用于复杂的机器人、自动驾驶系统和需要精确空间感知的工业应用。
ZED Mini:更适用于移动设备或增强现实的应用场景,如AR眼镜、VR头显等设备。它的体积小且轻便,适合对尺寸有严格要求的应用。
简而言之,ZED2i适合需要高性能深度感知和计算能力的场景,而ZED Mini则更适合便携性和增强现实、虚拟现实等轻量级应用。而关于流媒体传输的区别,ZED2i依赖于ZED SDK来管理和传输数据,而ZED Mini则可以通过IP直接进行流媒体传输,给用户更多灵活性。
最后因为需要防水加使用场景比较复杂选择了zed2i。
Setup ZED2
将zed sdk导入Unity
使用 ZED 在 Unity 中开发应用程序,需要满足以下条件:
(1)下载并安装最新的 ZED SDK。
(2)通过 Unity 的包管理器安装 ZED SDK 插件:
导航到 Editor 中的 Window -> Package Manager
点击左上角的 “+” 按钮,然后选择 “Add package from git URL…”
将此 URL 复制到字段中,然后单击 Add:
https://github.com/stereolabs/zed-unity.git?path=/ZEDCamera/Assets
注意:国内不要使用这个方法,我尝试了三个小时,就算是vpn也下载超时
建议更换为:
下载zip文件,解压,然后从本地电脑添加package:选择package.json
然后就大概率成功了。
之后大概率/随机会出现这个warning:
虽然官方建议是:
但是亲测这个解决方案没有用。建议先在package manager中确认一下是否安装了universal RP。
如果安装了,那就重开一下项目,如果还有就无视他吧。
我搏斗了两个小时,完全无法解决,询问了一下大佬,大佬说这个算是unity日常抽风。
果然,在我重启了一次电脑,接完了一杯水后,莫名其妙就不报这个错误了。
关于分辨率
zed2i输出的是4416*1242分辨率的视频,是双目摄像头的常见格式。因为是sidebyside格式,每只眼睛的分辨率为 2208×1242(左右各一半)。按横向比例来看,这比标准的 1080p(1920x1080)稍高一点,属于超宽屏,分辨率略高于 1080p。严格来说,2208×1242 并不完全符合标准 2K 的定义,但接近 2K 的范畴 。常见 16:9 的 2K 分辨率(QHD)为 2560×1440,这是常见的“2K”分辨率之一,主要用于显示器和高分辨率设备。而 2208 像素,超出了 DCI 2K 的 2048 水平分辨率,但是1242 像素,高于 1080,但低于 1440。如果把 2K 理解为横向分辨率大约 2000 像素,那么 2208×1242 可以算是 “超 2K 分辨率”。严格标准下,它不完全符合 DCI 2K 或 QHD 的定义,但在实际应用中,多数人会认为它已经达到或超过 2K 清晰度。(PS:我尝试在vive中打开这个视频,我感觉完全没有达到1080p的清晰程度,暂时不知道为什么)
simple AR示例程序
遇到的第一个问题是:运行后显示"Unable to open camera"
显示unable to open camera后,在相机软件中可以看到zed相机连接很不稳定,一直在断联重新连接,我原本以为是线接触不良。但是重启后是正常的,运行程序后才又开始了。最后通过修改resolution解决了-————————改为1080p 30fps。
猜测可能的原因是
1.带宽限制
高分辨率(例如 2K 或更高)的视频流需要更高的 USB 带宽。如果你的电脑的 USB 接口带宽不足,可能会导致相机数据传输不稳定,从而引发“接触不良”或断开的问题。
2.硬件性能瓶颈
高分辨率和帧率会对电脑的 CPU 和 GPU 造成更大的压力,尤其是在实时处理立体图像时。如果硬件性能不足,可能会导致驱动或程序无法稳定运行。
3.ZED 相机的功耗
高分辨率模式会让 ZED 相机工作在更高的功耗状态。如果电源供给不足,可能会出现设备连接不稳定的问题。==
目前仍然未知怎么使用2k 30fps。
如果有大佬知道请告诉我,球球了。
遇到的第二个问题:运行没有报错,但是显示不出摄像头传回来的视频
确定摄像头绑定的纹理能传回来了
Mat_ZED_Forward_Lighting_URP 应该实时绑定 ZED 摄像头的输出画面纹理:
- 在运行时选中相机stereo中的 frame canvas 对象,查看 Inspector 面板。
- 检查 Mat_ZED_Forward_Lighting_URP 的材质属性,确保 主纹理(Main Texture) 是否动态更新。
- 正常情况下,主纹理会显示 ZED 摄像头的实时画面。如果纹理为空或静态,则可能是绑定未正确完成。
如果能传回实时摄像头的纹理,那应该就是URP渲染的问题。
彻底解决这个问题:使用3D (Built-In Render Pipeline)项目模板。
Scene中的物体材质是不是粉色的
- Window > Rendering > Render Pipeline Converter
- 确保 Scriptable Render Pipeline Settings 中已设置为 URP。
- 勾选全部点击 Initialize Converter
- 在可用的转换器列表中选择 Built-in to URP。
- 点击 Convert Assets 按钮。
遇到的第三个问题:我想在电脑端察看左右两个摄像头回传的视频,但是永远都只能看到左边摄像头的视频
我原来以为zed提供的这个相机的预制件不允许电脑端查看左右两个摄像头的视频,因为教程里面写了在非AR直通模式下ZED_Rig_Stereo也可以工作,但第二个未使用的 Unity 摄像机将降低性能。但是我搜到这个youtube视频电脑是可以看到sidebyside格式的:https://www.youtube.com/watch?v=9nWCCf6WCFc。
我尝试的第一个方案是:
创建好左右两个RenderTexture;并绑定了左右RenderTexture 到左右摄像头LeftEyeCamera;并且创建了材质Material,绑定了RenderTexture到Material;最后我将左右两个摄像头底下的Frame中的对象quad的mesh 的材质设置为我创建的Material。
- 创建 RenderTexture
在 Project 窗口创建 RenderTexture:
在 Unity 的 Project 窗口中,右键点击空白处,选择: Create > Render Texture(创建一个渲染纹理)。
为创建的渲染纹理命名,例如:
LeftRenderTexture
RightRenderTexture
设置 RenderTexture 的分辨率:
选中 LeftRenderTexture 或 RightRenderTexture,在 Inspector 面板中设置其属性。
Width 和 Height:建议设置为与目标分辨率一致(例如 1920x1080 或 1280x720)。
Depth Buffer:一般可以设置为默认值 16 位(适合大多数 3D 场景)。
其他属性可以保持默认。- 绑定 RenderTexture 到摄像头
选中左眼和右眼的摄像头:
在 Hierarchy 面板中找到你的左眼摄像头(例如 LeftEyeCamera)和右眼摄像头(例如 RightEyeCamera)。
点击摄像头,查看 Inspector 面板中的属性。
设置摄像头的 Target Texture:
在 Inspector 面板中找到 Target Texture 属性。
将 LeftRenderTexture 拖动到左眼摄像头的 Target Texture 属性框中。
将 RightRenderTexture 拖动到右眼摄像头的 Target Texture 属性框中。
说明: 当你将 RenderTexture 绑定到摄像头时,该摄像头的渲染内容将不再直接显示在屏幕上,而是会被输出到指定的 RenderTexture 中。- 应用 RenderTexture 到材质
创建用于显示的材质:
在 Project 窗口中右键点击空白处,选择: Create > Material(创建材质)。
分别命名材质,例如:
LeftMaterial
RightMaterial
绑定 RenderTexture 到材质:
选中 LeftMaterial,在 Inspector 面板中:
找到 Main Texture 属性,将 LeftRenderTexture 拖放到这里。
对 RightMaterial 做同样的操作,将 RightRenderTexture 绑定到它的 Main Texture 属性。
应用材质到 Frame:
选中 LeftFrame(或 Frame 对象中的 Quad),找到其 Mesh Renderer 组件。
在 Materials 中,将 LeftMaterial 设置为其材质。
对右眼的 Frame 做相同操作,将 RightMaterial 应用到右眼的 Frame 上。
但是最后运行结果是No camera rendering。
后面我有注意到youtube视频里面有canvas,修改为第二个方案:
创建好左右两个RenderTexture,并绑定了左右RenderTexture 到左右摄像头LeftEyeCamera,再创建了一个canvas,在canvas中新建两个raw image,每个raw image的texture贴上我之前创建的RenderTexture,最后在创建一个Culling Mask为nothing的摄像头。(因为如果不创建一个Culling Mask为nothing的摄像头,虽然能看到两个摄像头传来的视频,但是还是会显示No camera rendering。)
我推测的原因可能是:ZED 提供的 Unity 插件可能包含自定义的渲染流程,例如quad 本身可能被设计成一种中间层,用来接收数据而不直接输出到屏幕。或者ZED 的双目渲染可能是为虚拟现实(VR)或增强现实(AR)优化的,其中 quad 的用途可能是为了投射到特定设备上,而不是直接在普通屏幕上显示。
根据 Stereolabs 官方文档的说明,ZED Unity 插件中的 Frame 对象 是位于摄像机前方的四边形(Quad),其主要功能是显示来自 ZED 实时摄像头的视频。 这些 Frame 对象使用特定的材质进行渲染,该材质会根据 ZED SDK 计算的每个像素的深度进行偏移,从而实现实时的遮挡和光照效果。在 ZED_Rig_Mono 预制件中,Frame 对象位于单个摄像机前方;而在 ZED_Rig_Stereo 预制件中,每个眼睛(左眼和右眼)都有各自的 Frame 对象,分别位于对应的摄像机前方。这些 Frame 对象的设计初衷是用于增强现实(AR)或虚拟现实(VR)应用,其中需要将现实世界的视频与虚拟内容进行融合。
因此,Frame 对象中的 Quad 主要用于在特定设备(如 VR 头显)上显示视频内容,而在普通屏幕上可能不会直接渲染。如果您希望在 Unity 的普通视口中显示 ZED 摄像头的实时视频,建议使用 RenderTexture 将摄像头的输出绑定到 UI 元素(如 Raw Image)上进行显示。
这种方法可以确保在非 VR 环境中正确显示视频内容。
以下是来自chatgpt的总结
整体逻辑回顾
ZED Rig Stereo 的预制件:
ZED SDK 提供了 ZED_Rig_Stereo 预制件,包含左右两个摄像头(Left Camera 和 Right Camera),分别模拟人眼立体视觉。
我们为左右眼创建对应的 RenderTexture,并将它们绑定到 Left Camera 和 Right Camera。
Raw Image 显示视频流:
在 Canvas 中,通过两个 Raw Image 显示左右眼的 RenderTexture。
每个 Raw Image 分别映射到左右眼的视频流,确保画面内容分离且对应。
解决 No Camera Rendering 问题:
Unity的默认行为要求场景中至少有一个有效的主相机进行渲染。
为了解决 No Camera Rendering 提示,需要添加一个 Culling Mask 设置为 Nothing 的额外摄像头,这个摄像头可以避免干扰你的 ZED_Rig_Stereo 的渲染逻辑。
优化和实现步骤
- 准备左右眼的 RenderTexture
创建两个 RenderTexture:
左眼的 RenderTexture_Left:
分辨率建议根据 ZED 相机的输出调整(如 1920x1080 或更高)。
右眼的 RenderTexture_Right:
保持与左眼分辨率一致。
绑定到 ZED_Rig_Stereo 的左右摄像头:
在 Left Camera 上设置 Target Texture 为 RenderTexture_Left。
在 Right Camera 上设置 Target Texture 为 RenderTexture_Right。- 配置 Canvas 和 Raw Image
在场景中创建一个 Canvas,设置为世界空间模式:
Canvas 的 Render Mode 设置为 World Space。
调整 Canvas 的大小和位置,使其与场景的视野相符。
在 Canvas 中创建两个 Raw Image:
左眼 Raw Image:
将 Texture 设置为 RenderTexture_Left。
调整位置,使其处于左眼显示区域。
右眼 Raw Image:
将 Texture 设置为 RenderTexture_Right。
调整位置,使其处于右眼显示区域。
设置 Raw Image 的 Aspect Ratio 和 Anchor:
确保 Raw Image 的宽高比与 RenderTexture 一致,避免拉伸或变形。- 添加辅助摄像头
为了解决 No Camera Rendering 的问题,添加一个辅助摄像头,设置如下:
创建辅助摄像头:
新建一个摄像头(命名为 BackgroundCamera)。
在 Camera 组件中设置:
Culling Mask:选择 Nothing,这样它不会干扰场景中的任何其他对象。
Clear Flags:设置为 Solid Color 或 Depth Only。
Depth:确保其渲染顺序低于 ZED_Rig_Stereo 的摄像头(设置为 -1)。
调整性能影响:
辅助摄像头只需要满足 Unity 的最低渲染需求,不会消耗实际性能。
如果需要进一步优化,可以禁用辅助摄像头的光照和后处理。
但是在zed文档中有写这么一句话:
With VR enabled in the Player settings, you can just drag the camera into the scene and run it. When a headset is detected, the prefab will position Camera_eyes using Unity’s built-in VR/XR functions. As such, you do not need any other plugins to use pass-through AR unless you want to add controller support.
所以我倾向于觉得如果直接连接hololens应该可以直接启动AR直通模式。(1.10待验证)
使用DJI倾斜摄影进行3d建模
【建模】使用无人机扫描建筑建模https://bbs.dji.com/pro/detail?tid=308276
【建模】使用无人机扫描建筑建模(摄影测量)https://www.bilibili.com/video/BV1B34y1Y7f6/?vd_source=d73bcadcbd9e57a79d4f2d6f16be5b41&spm_id_from=333.788.player.switch