# 3D Patch Generation Blender 工具 本文件夹包含 Blender 场景文件以及辅助脚本,用于导出网格体/相机数据,并将一张采集到的 2D 图像重新映射回 3D 表面。 ## 主要文件 - `dd02c_v2.blend` DD02C 曲面与相机配置所使用的主要 Blender 工程文件。 - `blender_export.py` 在 Blender 中运行,用于导出以下数据: - 网格几何信息 - 与 UV 相关的 loop 数据 - 相机内参 - 相机位姿 - 预计算的像素到 3D 查找表 - `mapto3d.py` 读取导出的数据和一张采集图像,并生成带颜色的 PLY 格式 3D 点云。 ## 导出 / 生成的数据 - `exported_data/` 由 `blender_export.py` 生成。通常应包含以下文件: - `mesh.npz` - `camera_intrinsics.npz` - `world_to_cam.npy` - `pixel_to_xyz.npz` - `captured_image.png` 要映射回导出 3D 表面的输入图像。当前该图像由 Blender 渲染得到。 - `mapped_points.ply` 由 `mapto3d.py` 生成的输出点云文件。 - `texture/` 保存实验过程中生成的纹理图片。 ## 工作流程 ### 1. 准备 Blender 场景 在 Blender 中打开 `dd02c_v2.blend`。 请确认: - 已选中目标网格 - 相机存在且位置正确 - 渲染分辨率与采集图像分辨率一致 ### 2. 导出几何和相机数据 在 Blender 的里面上面转到“scripts” 模式,然后点击运行 `blender_export.py`。 该脚本会将所需数据导出到: ```text exported_data/ ``` 脚本会写出以下内容: - 网格顶点和面信息 - UV loop 数据 - OpenCV 风格的相机内参 - world-to-camera 变换矩阵 - 可选的逐像素 3D 查找表 ### 3. 准备输入图像 将需要投影到 3D 表面的图像放到当前文件夹中,可以在Blender 渲染生成,例如: ```text captured_image.png ``` `mapto3d.py` 目前在其 `__main__` 代码块中直接指定输入图像路径。 ### 4. 将图像像素映射到 3D 运行: ```bash python mapto3d.py ``` 该脚本会: - 加载 Blender 导出的数据 - 加载输入图像 - 在需要时对图像做上下翻转,以匹配导出的像素映射顺序 - 优先使用预计算的 `pixel_to_xyz.npz` - 将结果保存为 `mapped_points.ply` 如果缺少预计算查找表,脚本会退回到逐像素射线求交,运行速度会慢很多。 ### 5. 查看输出结果 生成的点云可以使用支持 PLY 的工具打开,例如: - Open3D - MeshLab - CloudCompare `mapto3d.py` 中也包含可选的 Open3D 可视化步骤。 ## 说明 - `mapto3d.py` 目前假设导出的相机模型与输入图像分辨率一致。 - 脚本现在默认会对加载的图像做上下翻转,以保证映射颜色与 Blender 导出的像素顺序一致。 - 为了获得更好的性能,建议在 `exported_data/` 中保留 `pixel_to_xyz.npz`。 ## 依赖 ### Blender 侧 - Blender Python API:`bpy` - `numpy` ### Python 侧 - `numpy` - `opencv-python` - `open3d`(可选,用于可视化)