<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>pandas &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/pandas/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Fri, 10 Apr 2026 08:32:14 +0000</lastBuildDate>
	<language>en-GB</language>
	<copyright>© Terence Eden. 🄯 CC BY-SA. See https://shkspr.mobi/blog/copyright-and-copyleft/</copyright>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>pandas &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Reconstructing 3D Models from The Last Jedi]]></title>
		<link>https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/</link>
					<comments>https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#comments</comments>
				<dc:creator><![CDATA[Terence Eden]]></dc:creator>
		<pubDate>Tue, 10 Apr 2018 11:15:44 +0000</pubDate>
		<category><![CDATA[3D]]></category><category><![CDATA[AI]]></category><category><![CDATA[pandas]]></category><category><![CDATA[python]]></category><category><![CDATA[Star Wars]]></category>		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=29240</guid>

					<description><![CDATA[A quick tutorial in how to recover 3D information from your favourite 3D movies.  In this example, we&#039;ll be using Star Wars - The Last Jedi.  tl;dr? Here&#039;s the end result (this video is silent):  https://shkspr.mobi/blog/wp-content/uploads/2018/04/walker-text.mp4  Grab the code on GitHub.  Let&#039;s go!  Take a screenshot of your favourite scene.  Something with a clearly defined foreground and…]]></description>
										<content:encoded>&lt;p&gt;A quick tutorial in how to recover 3D information from your favourite 3D movies.&lt;/p&gt;

&lt;p&gt;In this example, we'll be using &lt;a href="https://amzn.to/2pZu15Z"&gt;Star Wars - The Last Jedi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;tl;dr? Here's the end result (this video is silent):&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-10" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/walker-text.mp4?_=10"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/walker-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/walker-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/edent/3D-Screenshot-to-3D-Model/"&gt;Grab the code on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="lets-go"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#lets-go"&gt;Let's go!&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Take a screenshot of your favourite scene.  Something with a clearly defined foreground and background.  The brighter the image the better the results.&lt;br&gt;
&lt;img src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey.jpg" alt="A stereo image pair. A young woman stands in front of a stony building." class="aligncenter size-full wp-image-29265" width="960" height="400"&gt;&lt;br&gt;
Split the image in two:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;mogrify -crop 50%x100% +repage screenshot.png
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, 3D movies compress the image horizontally. The separated screenshots will need to be restored to their full width.&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;mogrify -resize 200%x100% screenshot-*.*
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The next step involves a little trial-and-error. Generating a depth map can be done in several ways and it takes time to find the right settings for a scene.&lt;/p&gt;

&lt;p&gt;Here's &lt;a href="https://docs.opencv.org/3.4.1/dd/d53/tutorial_py_depthmap.html"&gt;a basic Python script which will quickly generate a depth map&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;import numpy as np
import cv2
from matplotlib import pyplot as plt

leftImage  = cv2.imread('screenshot-0.png',0)
rightImage = cv2.imread('screenshot-1.png',0)

stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(leftImage,rightImage)
plt.imshow(disparity,'gray')
plt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depending on the settings used for &lt;code&gt;numDisparities&lt;/code&gt; and &lt;code&gt;blockSize&lt;/code&gt;, the depth map will look something like one of these images.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/different-depth-maps.png" alt="Different depth maps of various accuracy" class="aligncenter size-full wp-image-29243" width="533" height="715"&gt;&lt;/p&gt;

&lt;p&gt;In these examples, lighter pixels represent points closer to the camera, and darker pixels represent points further away.  Optionally, you can clean up the image in your favourite photo editor.&lt;/p&gt;

&lt;p&gt;The next step is to create three-dimensional mesh based on that depth, and then paint one of the original colour images onto it.&lt;/p&gt;

&lt;p&gt;I recommend the excellent &lt;a href="https://github.com/daavoo/pyntcloud"&gt;pyntcloud&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;In order to speed things up, I resampled the images to be 192*80 - the larger the image, the slower this process will be.&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;import pandas as pd
import numpy as np
from pyntcloud import PyntCloud
from PIL import Image
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Get the colour image. Convert the RGB values to a DataFrame:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;colourImg    = Image.open("colour-small.png")
colourPixels = colourImg.convert("RGB")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add the RGB values to the DataFrame &lt;a href="https://stackoverflow.com/questions/49649215/pandas-image-to-dataframe"&gt;with a little help from StackOverflow&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;colourArray  = np.array(colourPixels.getdata()).reshape((colourImg.height, colourImg.width) + (3,))
indicesArray = np.moveaxis(np.indices((colourImg.height, colourImg.width)), 0, 2)
imageArray   = np.dstack((indicesArray, colourArray)).reshape((-1,5))
df = pd.DataFrame(imageArray, columns=["x", "y", "red","green","blue"])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Open the depth-map as a greyscale image. Convert it into an array of depths. Add it to the DataFrame&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;&amp;gt;depthImg = Image.open('depth-small.png').convert('L')
depthArray = np.array(depthImg.getdata())
df.insert(loc=2, column='z', value=depthArray)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Convert it to a Point Cloud and display it:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;df[['x','y','z']] = df[['x','y','z']].astype(float)
df[['red','green','blue']] = df[['red','green','blue']].astype(np.uint)
cloud = PyntCloud(df)
cloud.plot()
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="result"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#result"&gt;Result&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Here's the 192*80 image converted to 3D, and displayed in the browser:&lt;br&gt;
&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-11" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-small-pointcloud-text.mp4?_=11"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-small-pointcloud-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-small-pointcloud-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Wow! Even on a scaled down image, it's quite impressive. The 3D-ness is highly exaggerated - the depth is between 0-255.  You can either play around with image normalisation, or adjust the values of &lt;code&gt;z&lt;/code&gt; by using:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;df['z'] = df['z']*0.5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The code is relatively quick to run, this is the result on the full resolution image. The depth is less exaggerated here, although I've multiplied it by 5.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-12" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-hq-text.mp4?_=12"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-hq-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-hq-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h2 id="creating-meshes"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#creating-meshes"&gt;Creating Meshes&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;For quick viewing, PyntCloud has a built in plotter suitable for running in Jupyter. If you don't have that, or want something higher quality, viewing 3D meshes is best done in &lt;a href="http://www.meshlab.net/"&gt;MeshLab&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PyntCloud can create meshes in the &lt;a href="https://en.wikipedia.org/wiki/PLY_(file_format)"&gt;.ply format&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;cloud.to_file("hand.ply", also_save=["mesh","points"],as_text=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="better-depth-maps"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#better-depth-maps"&gt;Better Depth Maps&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;The key to getting this right is an accurate depth mapping. That's hard without knowing the separation of the cameras, or being able to meaningfully calibrate them.&lt;/p&gt;

&lt;p&gt;For example, from this image:&lt;br&gt;
&lt;img src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand.jpg" alt="A stereo image pair. A hand reaches for some books." class="aligncenter size-full wp-image-29261" width="960" height="400"&gt;&lt;/p&gt;

&lt;p&gt;We can calculate a basic depthmap:&lt;br&gt;
&lt;img src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-depth-small.png" alt="A black and white image. The outline of a hand is bright white, the background fades the grey." class="aligncenter size-full wp-image-29255" width="800" height="333"&gt;&lt;/p&gt;

&lt;p&gt;Which gives this 3D mesh:&lt;br&gt;
&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-13" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-simple-text.mp4?_=13"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-simple-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-simple-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;If you use a more complex algorithm to generate a more detailed map, you can get some quite extreme results.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-14" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-complex.mp4?_=14"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-complex.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-complex.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3 id="depthmap-code"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#depthmap-code"&gt;Depthmap Code&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;I'm grateful to &lt;a href="https://web.archive.org/web/20180410075642/https://timosam.com/python_opencv_depthimage"&gt;Timotheos Samartzidis for sharing his work&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-_"&gt;import cv2
import numpy as np
from sklearn.preprocessing import normalize

filename = "screenshot"

img_left  = cv2.imread(filename+'-1.png')
img_right = cv2.imread(filename+'-0.png')

window_size = 15

left_matcher = cv2.StereoSGBM_create(
    minDisparity=0,
    numDisparities=16,
    blockSize=5,
    P1=8 * 3 * window_size ** 2,
    P2=32 * 3 * window_size ** 2,
    # disp12MaxDiff=1,
    # uniquenessRatio=15,
    # speckleWindowSize=0,
    # speckleRange=2,
    # preFilterCap=63,
    # mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY
)

right_matcher = cv2.ximgproc.createRightMatcher(left_matcher)

wls_filter = cv2.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher)
wls_filter.setLambda(80000)
wls_filter.setSigmaColor(1.2)

disparity_left  = left_matcher.compute(img_left, img_right)
disparity_right = right_matcher.compute(img_right, img_left)
disparity_left  = np.int16(disparity_left)
disparity_right = np.int16(disparity_right)
filteredImg     = wls_filter.filter(disparity_left, img_left, None, disparity_right)

depth_map = cv2.normalize(src=filteredImg, dst=filteredImg, beta=0, alpha=255, norm_type=cv2.NORM_MINMAX);
depth_map = np.uint8(depth_map)
depth_map = cv2.bitwise_not(depth_map) # Invert image. Optional depending on stereo pair
cv2.imwrite(filename+"-depth.png",depth_map)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As good as this code is, you may need to tune the parameters on your images to get something acceptable.&lt;/p&gt;

&lt;h2 id="more-models"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#more-models"&gt;More models!&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Here are a few of the interesting meshes I made from the movie.  Some are more accurate than others.&lt;/p&gt;

&lt;h3 id="snokes-head"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#snokes-head"&gt;Snoke's Head&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-15" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/snoke-text.mp4?_=15"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/snoke-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/snoke-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3 id="throne-room-battle"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#throne-room-battle"&gt;Throne Room Battle&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-16" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/throne-text.mp4?_=16"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/throne-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/throne-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3 id="v-4x-d-ski-speeders"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#v-4x-d-ski-speeders"&gt;V-4X-D Ski Speeders&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-17" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/snow-text.mp4?_=17"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/snow-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/snow-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3 id="kylo-rens-tie-fighter-guns"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#kylo-rens-tie-fighter-guns"&gt;Kylo Ren's TIE Fighter Guns&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;&lt;div style="width: 620px;" class="wp-video"&gt;&lt;video class="wp-video-shortcode" id="video-29240-18" width="620" height="318" preload="metadata" controls="controls"&gt;&lt;source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2018/04/tie-text.mp4?_=18"&gt;&lt;a href="https://shkspr.mobi/blog/wp-content/uploads/2018/04/tie-text.mp4"&gt;https://shkspr.mobi/blog/wp-content/uploads/2018/04/tie-text.mp4&lt;/a&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h2 id="is-tlj-really-3d"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#is-tlj-really-3d"&gt;Is TLJ &lt;em&gt;really&lt;/em&gt; 3D?&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.bustle.com/p/is-the-last-jedi-in-3d-worth-it-theres-a-better-way-to-upgrade-your-experience-7549762"&gt;Nope&lt;/a&gt;! The movie was filmed with regular cameras and converted in post-production.&lt;/p&gt;

&lt;p&gt;As &lt;a href="https://shkspr.mobi/blog/2016/11/how-3d-is-star-wars-the-force-awakens/"&gt;I've discussed before&lt;/a&gt;, The Force Awakens has some scenes which have some reasonable 3D, but it wasn't a great conversion. I think TLJ is done much better - but I wish the CGI was properly rendered in 3D.&lt;/p&gt;

&lt;p&gt;Much of the 3D-ness is one or two foreground elements floating against a background. If you want &lt;em&gt;real&lt;/em&gt; 3D models, you need something shot and edited for 3D - for example this &lt;a href="https://shkspr.mobi/blog/2013/11/creating-animated-gifs-from-3d-movies-hsbs-to-gif/"&gt;Doctor Who 3D special&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;iframe title="Converting Stereoscopic Images from HSBS Movies into 3D Models" width="620" height="465" src="https://www.youtube.com/embed/YGJ4qdoAfAw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;h2 id="further-reading"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#further-reading"&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Getting this working took me all around the interwibbles - here are a few resources that I used.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20180405183853/http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html"&gt;Callibration of stereo cameras&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20200925010505/https://rdmilligan.wordpress.com/2016/05/15/epipolar-geometry-and-depth-map-from-stereo-images/"&gt;Epipolar Geometry and Depth Map from stereo images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rdmilligan.wordpress.com/2016/05/23/disparity-of-stereo-images-with-python-and-opencv/"&gt;Disparity of stereo images with Python and OpenCV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erget.wordpress.com/2014/05/02/producing-3d-point-clouds-from-stereo-photos-tuning-the-block-matcher-for-best-results/"&gt;Optimizing point cloud production from stereo photos by tuning the block matcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://albertarmea.com/post/opencv-stereo-camera/"&gt;Calculating a depth map from a stereo camera with OpenCV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adrelino/ppf-reconstruction"&gt;3D Object Reconstruction using Point Pair Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20200925010509/https://svncvpr.in.tum.de/redmine/projects/cvpr-ros-pkg/repository/entry/trunk/rgbd_benchmark/rgbd_benchmark_tools/scripts/generate_pointcloud.py"&gt;Dr. Jürgen Sturm's "Generate Pointcloud"&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="copyright"&gt;&lt;a href="https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/#copyright"&gt;Copyright&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Star Wars: The Last Jedi is copyright Lucasfilm Ltd.&lt;br&gt;
These 6 screenshots fall under the &lt;a href="https://www.gov.uk/guidance/exceptions-to-copyright"&gt;UK's limited exceptions to copyright&lt;/a&gt;.&lt;br&gt;
Any code I have written is available under the BSD License and is &lt;a href="https://github.com/edent/3D-Screenshot-to-3D-Model/"&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=29240&amp;amp;HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager"&gt;</content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/04/reconstructing-3d-models-from-the-last-jedi/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/walker-text.mp4" length="2283290" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-small-pointcloud-text.mp4" length="2534113" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/rey-hq-text.mp4" length="3773259" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-simple-text.mp4" length="1318009" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/hand-complex.mp4" length="4720974" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/snoke-text.mp4" length="1552649" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/throne-text.mp4" length="4189882" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/snow-text.mp4" length="3335439" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2018/04/tie-text.mp4" length="2889951" type="video/mp4" />

			</item>
	</channel>
</rss>
