NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
本文记录作者基于摄影测量技术的三维重建实验过程。
1、拍摄照片
任何摄影测量冒险都始于捕捉 3D 物体的照片。就我而言,要测量物体是我祖父的半身像,重 16 磅(7.26 千克),宽约 1 英尺(30 厘米)。
我可以把半身像放在一个平面上,然后从各个方向拍照,依靠软件为我“清理东西”。
但作为一名程序员,我知道输入垃圾等于输出的垃圾,图像越干净,拍摄得越精确,我以后清理伪像或修改不精确模型所需要做的工作就越少——至少是这样 我的理论。
所以我用两块圆木和一个轴承做了个旋转转盘:
我用纯白色背景(一张海报板)设置它,并在我贴在 DIY托盘上的一条胶带上测量出 10° 的增量,这样我就可以精确地旋转它。
最后,我从四个高度拍摄了一系列 148 张图片:
我将这些照片导入计算机,稍微调整一下曝光度,使白色背景稍微有点过曝(纯白色),并准备好一组 24 兆像素的 JPEG 用于摄影测量过程——超过 35 亿像素的数据可以使用 和!
2、第一次尝试(失败)
由于我有一台 Mac(当时配备 i9 处理器的 2019 16" Macbook Pro),我没有任何 Nvidia CUDA 内核可供我使用(至少在本地)。而且它似乎更受 GUI 驱动,摄影测量程序(通常需要 CUDA 内核)仅适用于 Windows。
但我最终找到了免费的跨平台应用程序 Regard3D,并按照官方教程进行操作。 我能够得到一个结果,但是生成的 3D 网格真的很乱:
你可以看到人像似乎被冻在了粘液床上。 要忠实再现原始半身像,需要在 Meshmixer 中做大量工作。
我给堂兄发了同样的一组照片,但也很难找到一个好的初始模型。
3、第二次尝试:COLMAP + OpenMVS
最后,我找到了 Peter L. Falkingham 博士关于 COLMAP + OpenMVS 的这篇博文。 他编写了一个 .bat 脚本,该脚本使用两个开源工具(至少在 Windows 上)从一组图像生成 3D 模型。
我需要安装 COLMAP 和 OpenMVS,幸运的是,我还找到了 joecooning 的优秀 文章,Mac OS 上的免费摄影测量:从照片到 3D 模型,并按照他的说明安装这些软件。
3.1 安装 COLMAP
从 COLMAP GitHub 发布页面下载最新的 COLMAP-dev-mac-no-cuda.zip 文件,展开它,并将 COLMAP 放在应用程序文件夹中。
3.2 安装 OpenMVS
- 使用 Homebrew 安装 OpenMVS 的依赖项:
brew install boost eigen opencv cgal ceres-solver
。 - 安装CMake。
- 安装 XCode。
- 克隆 VCG 库:
git clone https://github.com/cdcseacave/VCG.git vcglib
- 克隆 OpenMVS:
git clone https://github.com/cdcseacave/openMVS.git
- 创建一个单独的构建目录来构建 OpenMVS:
mkdir openMVS_build && cd openMVS_build
- 构建 OpenMVS:
cmake。 ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="pwd/vcglib" -G "Xcode"
- 使用 xcodebuild 编译应用程序:
xcodebuild -configuration Release
3.3 运行 photogrammetry.sh
使用此 shell 脚本(嵌入在下方)在一个你希望转换为 3D 模型的对象图像的目录中运行摄影测量过程:
#!/bin/bash
# Photogrammety automation script.
#
# Based on https://peterfalkingham.com/2018/04/01/colmap-openmvs-scripts-updated/
# Adapted from https://www.instructables.com/Free-Photogrammetry-on-Mac-OS-From-Photos-to-3D-Mo/
#
# See full guide on Jeff Geerling's blog:
# TODO
#
# Usage:
# 1. Save this script into a file named `photogrammetry.sh`, in the directory
# where you saved the photos you took of a 3D object.
# 2. Give it execute permissions (`chmod +x photogrammetry.sh`).
# 3. Replace the '/Users/jgeerling/*' paths with your own.
# 4. Run `./photogrammetry.sh`
# 5. Wait.
#
# It will take a LONG time, especially if you use tons of high-res photos.
# Get current directory path.
current_dir=$PWD
# Store the current directory name for object output.
dir_name=${PWD##*/}
# Set colmap directory (change this to where you've placed colmap).
colmap_dir=/Applications/COLMAP.app/Contents/MacOS/colmap
# Set openMVS directory (change this to the 'bin/Release' folder where you built openMVS).
openmvs_dir=/Users/jgeerling/Downloads/photogrammetry/openMVS_build/bin/Release
# Set Working Directory (I create a temporary workspace folder in my 'Projects' directory to process data in)
working_dir=/Users/jgeerling/Downloads/photogrammetry/workspace
mkdir $working_dir
cp *.jpg $working_dir/
cp *.JPG $working_dir/
cd $working_dir
$colmap_dir feature_extractor --database_path database.db --image_path .
$colmap_dir exhaustive_matcher --database_path database.db
mkdir sparse
$colmap_dir mapper --database_path database.db --image_path . --output_path sparse
$colmap_dir model_converter --input_path sparse/0 --output_path model.nvm --output_type NVM
$openmvs_dir/InterfaceVisualSFM model.nvm
$openmvs_dir/DensifyPointCloud model.mvs
$openmvs_dir/ReconstructMesh model_dense.mvs
$openmvs_dir/RefineMesh --resolution-level 1 model_dense_mesh.mvs
$openmvs_dir/TextureMesh --export-type obj -o $dir_name.obj model_dense_mesh_refine.mvs
mkdir $current_dir/model/
cp *.obj $current_dir/model/
cp *.mtl $current_dir/model/
cp *Kd.jpg $current_dir/model/
cd $current_dir
运行脚本后,新的“模型”目录应包含一个 .jpg 纹理贴图图像、一个 .mtl(材质设置)文件和一个 .obj(3D 对象)文件。
我在免费的 Meshmixer 应用程序中导入了 .obj 文件,哇,它几乎完全正确......除了对象是颠倒的:
4、最终结果
我花了一些时间清理 Meshmixer 中的底部边缘,并进行“平面切割”以切掉底部并丢弃来自转盘的所有工件。 然后我将对象制作成实体(这对于 3D 打印来说不是绝对必要的,但在我的情况下更容易处理)并导出它。
它看起来相当惊人,甚至捕捉到了一些肉眼可能一眼就看不到的微小细节!
这是我用这个模型制作的 3D 打印的一个简短片段,使用 Octolapse 和我的尼康 D700 生成:
原文链接:Modeling my Grandpa with 3D Photogrammetry
BimAnt翻译整理,转载请标明出处