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翻译整理,转载请标明出处