<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Multi-view stereo on Boris Dupoux</title><link>https://borisdupoux.com/tags/multi-view-stereo/</link><description>Recent content in Multi-view stereo on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/tags/multi-view-stereo/index.xml" rel="self" type="application/rss+xml"/><item><title>Handheld Video to Photogrammetry and Gaussian Splatting</title><link>https://borisdupoux.com/research/photogrammetry-splatting/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/research/photogrammetry-splatting/</guid><description>&lt;h2 id="whats-original"&gt;&lt;a href="#whats-original" class="header-anchor"&gt;&lt;/a&gt;What&amp;rsquo;s original
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keyframes chosen by overlap, not by clock.&lt;/strong&gt; A new frame is kept when the view has
moved enough, and the sharpest candidate wins, so the reconstruction gets fewer,
better images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality checks that catch &amp;ldquo;valid but wrong&amp;rdquo; models.&lt;/strong&gt; A fast reconstruction can pass
the usual registration and reprojection criteria while being geometrically incoherent;
a trajectory-continuity check detects this and switches to a slower, safer method.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built to share a GPU.&lt;/strong&gt; GPU stages wait for free memory and run one at a time, so
long jobs already on the card are never pre-empted; degraded quality is flagged rather
than reported as a silent success.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works"&gt;&lt;a href="#how-it-works" class="header-anchor"&gt;&lt;/a&gt;How it works
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 A["Handheld 4K video"] --&gt; B["Keyframe selection"]
 B --&gt; C["Structure from motion"]
 C --&gt; D{"Quality checks"}
 D -- fail --&gt; C
 D -- pass --&gt; E["Dense cloud + textured mesh"]
 E --&gt; F["Gravity + Manhattan alignment"]
 F --&gt; G["Orthoviews + renders"]
 E --&gt; H["Gaussian Splatting"]
 G --&gt; I["Web exports + report"]
 H --&gt; I&lt;/pre&gt;&lt;p&gt;COLMAP recovers camera poses, OpenMVS builds the dense cloud and mesh, and gsplat trains
the splat. The scene is then aligned to gravity, the floor and the dominant wall
directions, so plan and elevation views come out square; the same transform is applied
to the mesh and the splat. Every stage can be resumed or redone.&lt;/p&gt;
&lt;h2 id="results"&gt;&lt;a href="#results" class="header-anchor"&gt;&lt;/a&gt;Results
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;At five locations of an indoor commercial site, one 4K video each, every selected
keyframe was registered in every location.&lt;/li&gt;
&lt;li&gt;The geometry check worked as intended: it raised an alert on every run rather than
reporting a silent success.&lt;/li&gt;
&lt;li&gt;Capture metadata showed slow shutter speeds with automatic ISO and white balance;
exposure compensation during splat training gave no gain on one location (single run).&lt;/li&gt;
&lt;li&gt;Merging videos from different locations produced false matches, so each location is
processed on its own.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="evidence--limits"&gt;&lt;a href="#evidence--limits" class="header-anchor"&gt;&lt;/a&gt;Evidence &amp;amp; limits
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Reprojection error is above the pipeline&amp;rsquo;s own 1 px target, and splat PSNR sits in the
low 20s on held-out views.&lt;/li&gt;
&lt;li&gt;One run per location, with a small held-out set; the figures come from the project
README, as run logs were not archived.&lt;/li&gt;
&lt;li&gt;That quality is limited by capture (motion blur, auto-exposure) is a hypothesis, not
yet tested by recapturing with locked settings.&lt;/li&gt;
&lt;li&gt;Dark glossy floors reconstruct poorly, and Manhattan alignment is not yet reliable with
furniture and glazing. A comparison with a commercial photogrammetry suite is planned.&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;Technical details&lt;/summary&gt;
&lt;p&gt;Five locations at one indoor commercial site, one handheld 4K video per location, each
processed once, unattended, on a single high-end GPU. PSNR/SSIM on held-out keyframes.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Location&lt;/th&gt;
					&lt;th&gt;Keyframes&lt;/th&gt;
					&lt;th&gt;SfM registered · points · mean reproj.&lt;/th&gt;
					&lt;th&gt;Dense cloud&lt;/th&gt;
					&lt;th&gt;Splat PSNR / SSIM&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;116&lt;/td&gt;
					&lt;td&gt;116/116 · 21,458 · 1.49 px&lt;/td&gt;
					&lt;td&gt;1.40 M&lt;/td&gt;
					&lt;td&gt;23.2 / 0.86&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;103&lt;/td&gt;
					&lt;td&gt;103/103 · 18,972 · 1.75 px&lt;/td&gt;
					&lt;td&gt;1.23 M&lt;/td&gt;
					&lt;td&gt;20.6 / 0.81&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;47&lt;/td&gt;
					&lt;td&gt;47/47 · 13,167 · 1.17 px&lt;/td&gt;
					&lt;td&gt;1.26 M&lt;/td&gt;
					&lt;td&gt;23.1 / 0.86&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;121&lt;/td&gt;
					&lt;td&gt;121/121 · 11,970 · 1.34 px&lt;/td&gt;
					&lt;td&gt;1.99 M&lt;/td&gt;
					&lt;td&gt;21.9 / 0.85&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;64&lt;/td&gt;
					&lt;td&gt;64/64 · 12,106 · 1.48 px&lt;/td&gt;
					&lt;td&gt;0.91 M&lt;/td&gt;
					&lt;td&gt;21.8 / 0.83&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h2 id="stack"&gt;&lt;a href="#stack" class="header-anchor"&gt;&lt;/a&gt;Stack
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python&lt;/code&gt; · &lt;code&gt;OpenCV&lt;/code&gt; · &lt;code&gt;Open3D&lt;/code&gt; · &lt;code&gt;NumPy&lt;/code&gt; · &lt;code&gt;COLMAP&lt;/code&gt; · &lt;code&gt;OpenMVS&lt;/code&gt; · &lt;code&gt;gsplat&lt;/code&gt; · &lt;code&gt;PyTorch (CUDA)&lt;/code&gt; · &lt;code&gt;Blender&lt;/code&gt; · &lt;code&gt;FFmpeg&lt;/code&gt; · &lt;code&gt;PotreeConverter&lt;/code&gt; · &lt;code&gt;glTF-Transform&lt;/code&gt; · &lt;code&gt;splat-transform&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>