Converting a fisheye image into a panoramic, spherical or perspective projection

Written by Paul Bourke
November 2004

The source code implementing the projections
below is only availableon request for a small fee. It includes a demo
application and an invitation toconvert an image of your choice to
verify the code does what you seek. For more information
please contact the author.

The following documents various transformations from
fisheye into other projectiontypes, specifically standard perspective as
per a pinhole camera, panorama andspherical projections.Fisheye images
capture a wide field of view, traditionally
one thinks of 180degrees but the mathematical definition extends past
that and indeed there aremany physical fisheye lenses that extend past
180 degrees. The two main applicationsfor the following are: the
inspection of images/video from security cameras wherepanorama
or perspective views may be more natural to view, creating panorama
orspherical images that are blended together to form even wider field of
view images.

The general options for the software include the
dimensions of the output image as wellas the aperture of the output
panoramic or perspective frustum. Some otherrequirements arise from
imperfect fisheye capture such as the fisheye notbeing
centered on the input image, the fisheye not be aligned with
theintended axis, and the fisheye being of any angle.Another
characteristic of real fisheye images is their lack of linearitywith
radius on the image, while this is not addressed here as it requiresa
lens calibration, it is a straightforward correction to make.

The usual approach for such image transformations is
to perform the inverse mapping. Thatis, one needs to consider each pixel
in the output image and map backwards tofind the closest pixel in the
input image (fisheye). In this way every pixelin
the output image is found (compared to a forward mapping), it also
meansthat the performance is governed by the resolution of the output
image(and supersampling) irrespective of the size of the input image.A
key aspect of these mappings is also to perform
some sort of antialiasing, thesolutions here use a simple supersampling
approach.

The code here are all plain vanilla C tested on Unix
style gcc systems (specifically Mac and Linux),but the algorithms/code
can readily be modified for otheroperating systems and programming
languages.This is not meant to be a final application
but rather something you integrate into your code base. Having said
that it is wrapped up in a simple TGA image reader/writer for the
purposes of algorithm testing, the intent is that one would be
implementing the function into ones own code base. They all
operate on a RGB buffer (fisheye image) in memory.For each test utility
the usage message is provided. The source images for the
examplesprovided are provided along with the command line that generated
them.

Fisheye to perspective transformation
Software:
fish2persp

Usage: fish2persp [options] fisheyeimage
Options
-w n perspective image width, default = 800
-h n perspective image height, default = 600
-t n aperture of perspective (degrees), default = 100
maximum is 170 degrees
-s n aperture of fisheye (degrees), default = 180
-c x y offset of the center of the fisheye image,
default is fisheye image center
-r n fisheye radius, default is half height of fisheye image
-x n tilt angle (degrees), default: 0
-y n roll angle (degrees), default: 0
-z n pan angle (degrees), default: 0
-a n antialiasing level, default = 1 (no antialising)
sensible maximum 3

It should be noted at the outset that a fisheye projection is not a "distorted" image, and the process isn’t a “dewarping”. A fisheye like other projections is one of many ways of mapping a 3D world onto a 2D plane, it is no more or less "distorted" than other projections including a rectangular perspective projection ... it is what it is.

Example source fisheye image.

A critical consideration is antialiasing, required when sampling any discrete signal. The approach here is a simple supersampling antialiasing, that is,each pixel in the output image is subdivided into a 2x2, 3x3....grid andthe inverse mapping applied to the subsamples. The final value for the outputpixel is the weighted average of the inverse mapped subsamples.There is a sense in which the image plane is considered to be a continuousfunction. Since the number of samples that are inverse mapped is the principle determinant ofperformance, high levels of antialiasing can be very expensive, typically2x2 or 3x3 are sufficient especially for images captured from video in whichneighbouring pixels are not independent in the first place.For example a 3x3 antialiasing is 9 times slower than no antialiasing.In general the jagged edges are more noticeable in featureswith a sharp colour/intensity boundary.

Default perspective view looking forwards, 100 degrees horizontal field of view.


fish2persp -w 800 -a 3

The vertical aperture is automatically adjusted to
match the width and height.Controls are provided for any angle fisheye
as well as fisheyes that are notlevel or tilted, noting that the exact
order of the correction rotations mayneed to
be considered for particular cases.Note that a perspective projection
is not defined for greater than 180 degrees,indeed it gets increasingly
inefficient past around 140 degrees.The field of view can be adjusted as
well as the viewing direction.The following
example is a 120 degrees horizontal field of view and looking upwards
by 30 degrees.


fish2persp -w 800 -a 3 -x 30 -t 120

If "straight" lines are not straight that normally
means the fisheye center or radius are not specified correctly or the
angle is not defined correctly.Curvature in what should be straight
lines near the rim of the fisheye normally meansthe
fisheye lens has non-linearities near the rim (a deviation from the
mathematically purefisheye projection) and corrections need to be
applied.The following is looking right by 40 degrees and a narrower
field of view of 80 degrees.


fish2persp -w 800 -a 3 -z 40 -t 80

The center of the fisheye on the input image can be
found by projectinglines along vertical structure in the scene. Where
these lines intersectis a close approximation to the center of the
fisheye, assuming thecamera is mounted vertically.
Alternatively, and perhaps easier, is to identify the edges of
thefisheye and assume a perfect circular inscribed circle. Note that for
the example utilities providedhere the origin is assumed to be the
bottom left corner, unlike the more common top right
thatimage editing programs use.

To test the algorithm a fisheye rendering inside a
gridded cube is a good example,see image on left below. Any correct
perspective projection should result in straight lines.


Sample input image

 

 

 

Front pointing fisheye to panorama
Software:
frontfish2pano

This case is developed mainly for "front
pointing" fisheyes although it does have applicationfor other
orientations. The projection is more correctly called a cylindrical
panorama.

Usage: frontfish2pano [options] fisheyeimage
Options
-w n panoramic image width, default = 800
-h n panoramic image height, default = -1
-ap n vertical aperture of panoramic, default = 100
-af n aperture of fisheye (degrees), default = 180
-cf x y center of the fisheye image, default is image center
-r n radius of the fisheye image, default is half the image width
-fa n angle for tilted fisheye, default = 0
-fb n angle for rotated fisheye, default = 0
-a n antialiasing level, default = 1 (no antialising)

Source fisheye image.

Transformation with the default settings is shown below.


frontfish2pano -a 3 -w 800

Correct for the fact that the camera is not quite
horizontal, this is thereason the vertical structure doesn't appear
vertical in the panoramic projection.Of course nothing is for free, one
looses a bit of the image in the bottomleft and
right corners.


frontfish2pano -a 3 -w 800 -fa -20

Set the vertical field of view of the panorama, in
the following cases narrowed fromthe default of 100 degrees to 80
degrees. As with perspective projections there is a limit, in this case,
to the vertical field of view, a hard limit at 180
degrees but increasingly inefficientpast 140 degrees.


frontfish2pano -a 3 -w 800 -fa -20 -ap 80

Fisheye to (partial) spherical projection
Software:
fish2sphere

Usage: fish2sphere [options] imagefile
Options
-w n sets the output image size, default: 4 fisheye image width
-a n sets antialiasing level, default: 2
-fa n fisheye aperture (degrees), default: 180
-c x y fisheye center, default: center of image
-r n fisheye radius, default: half the fisheye image width
-v n rotate fisheye in latitude, default: 0
-z n roll fisheye, default: 0
-d debug mode

Source fisheye image.

Transformation using the default settings. Since a 180 degree (in this case) fisheyecaptures half the visible universe from a single position, so it makes sense that it occupieshalf of a spherical (equirectangular) projection, which captures the entire visibleuniverse from a single position.

In this case the camera is not perfectly horizontal, this and other adjustmentscan be made. In the example here the lens was pointing downwards slightly, thecorrection results in more of the south pole being visible and less of the northpole.

Note that the fisheye angle is not limited to 180 degrees, indeed one applicationfor this is in the pipeline to create 360 spherical panoramas from 2 cameras, eachwith a fisheye lens with a field of view greater than 180 to provide a blend zone.

This can be readily implemented in the OpenGL Shader Language, the followingexample was created in theQuartz Composer Core Image Filter.

  1. // Fisheye to spherical conversion
  2. // Assumes the fisheye image is square, centered, and the circle fills the image.
  3. // Output (spherical) image should have 2:1 aspect.
  4. // Strange (but helpful) that atan() == atan2(), normally they are different.
  5. kernel vec4 fish2sphere(sampler src)
  6. {
  7. vec2 pfish;
  8. float theta,phi,r;
  9. vec3 psph;
  10. float FOV = 3.141592654; // FOV of the fisheye, eg: 180 degrees
  11. float width = samplerSize(src).x;
  12. float height = samplerSize(src).y;
  13. // Polar angles
  14. theta = 2.0 * 3.14159265 * (destCoord().x / width - 0.5); // -pi to pi
  15. phi = 3.14159265 * (destCoord().y / height - 0.5);  // -pi/2 to pi/2
  16. // Vector in 3D space
  17. psph.x = cos(phi) * sin(theta);
  18. psph.y = cos(phi) * cos(theta);
  19. psph.z = sin(phi);
  20. // Calculate fisheye angle and radius
  21. theta = atan(psph.z,psph.x);
  22. phi = atan(sqrt(psph.x*psph.x+psph.z*psph.z),psph.y);
  23. r = width * phi / FOV;
  24. // Pixel in fisheye space
  25. pfish.x = 0.5 * width + r * cos(theta);
  26. pfish.y = 0.5 * width + r * sin(theta);
  27. return sample(src, pfish);
  28. }

The transformation can be performed in realtime using warp mesh files forsoftware such aswarpplayer or the VLC equivalentVLCwarp.
A sample mesh file is givenhere:fish2sph.data. Showing the result in actionis below.

Test cases for various fisheye apertures.
180 degree fisheye
120 degree fisheye
220 degree fisheye
220 degree fisheye and 90 degree latitude rotation
220 degree fisheye and 60 degree latitude rotation

Fisheye to (full) panorama
Software:
fish2pano

The following is a slightly more general version of
conversion to a panoramic projection.It supports both spherical and
cylindrical projections, handles different fisheyeorientations but the
main difference is it is designed to image into
a full 360 projection obviously withparts not covered because of the
limited field of view of a fisheye compared to a fullspherical
projection.

Usage: fish2pano [options] fisheyeimage
Options
-w n panoramic image width, default = 1024
-h n panoramic image height, default = derived
-af n aperture of fisheye (degrees), default = 180
-cf x y center of the fisheye image, default is image center
-x n tilt fisheye about x (right) axis, default = 0
-z n rotate fisheye about lens axis, default = 0
-r n radius of the fisheye image, default is half the image width
-a n antialiasing level, default = 1 (no antialising)
-c cylindrical pano, default is spherical
-v n vertical aperture for cylindrical pano, default: 60

Example 1: Source fisheye image.

Black refers to the corners of the fisheye image and the grey to the unavailable data,that is, data outside the fisheye rectangle in which the circular fisheye is inscribed.Note that for a wider than 180 degree fisheye the black and grey regions will be correspondingly smaller. The "x" axis is to the right, the 90 degree rotation heregives the desired result for a forward pointing fisheye. A fisheye pointing straightup or straight down would more normally be transformed with "-x 0".


fish2pano -a 3 -w 800 -x 90

Cylindrical projection, vertical field 60 degrees and
100 degrees respectively.The vertical extent of the image is, normally,
determined correctly given the vertical field of view requested but
that can be overruled if desired.


fish2pano -a 3 -w 800 -x 90 -c
fish2pano -a 3 -w 800 -x 90 -c -v 100

Example 2: Source fisheye image

The default settings (no x axis rotation) provide
what one expects for an upper hemisphereas per a standard Earth map.
Note the apparent distortion towards the north pole, which againis not a
strictly distortion but a natural consequence
of the mathematics behind the projection.


fish2pano -a 3 -w 800

Cylindrical panorama with a 100 degree vertical field
of view, that is, from the equator (0 degreeslatitude) to 100 degrees
latitude.


fish2pano -a 3 -w 800 -c -v 100

Converting a fisheye image into a panoramic, spherical or perspective projection [转]的更多相关文章

  1. Fisheye projections from spherical maps [转]

    Fisheye projections from spherical maps Written by Paul Bourke May 2003, software updated January 20 ...

  2. Computer Generated Angular Fisheye Projections [转]

    Computer GeneratedAngular Fisheye Projections Written by Paul Bourke May 2001 There are two main ide ...

  3. 鱼眼模式(Fisheye projection)的软件实现

    简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ...

  4. 鱼眼投影方式(Fisheye projection)的软件实现

    简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ...

  5. Linear or non-linear shadow maps?

    Quote: Original post by RobMaddisonI understand that, for aliasing mitigation, it might be beneficia ...

  6. 计算机视觉code与软件

    Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...

  7. D3学习之:D3.js中的12中地图投影方式

    特别感谢:1.[张天旭]的D3API汉化说明.已被引用到官方站点: 2.[馒头华华]提供的ourd3js.com上提供的学习系列教程,让我们这些新人起码有了一个方向. 不得不说,学习国外的新技术真的是 ...

  8. Physically Based Shader Development for Unity 2017 Develop Custom Lighting Systems (Claudia Doppioslash 著)

    http://www.doppioslash.com/ https://github.com/Apress/physically-based-shader-dev-for-unity-2017 Par ...

  9. 球谐光照(Spherical Harmonics Lighting)及其应用-实验篇

    简介 之前在一篇实时深度图优化的论文中看到球谐光照(Spherical Harmonics Lighting)的应用,在查阅了许许多多资料之后还是无法完全理解,我个人觉得如果之前对实时渲染技术不是很了 ...

随机推荐

  1. SASS详解之混合(mixins)

    SASS详解之混合(mixins)可以出现在SASS的任何地方.有很多类名具有相同或者相似的样式,就可以用SASS中的混合(mixins)来进行编写,然后针对不同类名的不同样式逐一编写. 定义一个混合 ...

  2. 【SQL SERVER】触发器(二)

    前言:上面一片文章整理了触发器的基础知识点,下面我们看看如何使用触发器以及insert和delete表: 这里我们补充一下触发器的缺点: 性能较低.我们在运行触发器时,系统处理的大部分时间花费在参照其 ...

  3. CodeForces 785D Anton and School - 2

    枚举,容斥原理,范德蒙恒等式. 先预处理每个位置之前有多少个左括号,记为$L[i]$. 每个位置之后有多少个右括号,记为$R[i]$. 然后枚举子序列中第一个右括号的位置,计算这个括号的第一个右括号的 ...

  4. laravel框架安装过程中遇到的问题

    1.安装laravel框架之前的必要环境 php环境:网上有集成好的服务器,例如wamp,phpstudy.当然你可以自己搭建属于自己的环境.其中php必须是7.1版本以上: compose:php的 ...

  5. Nginx配置站点https

    step 1: 检查nginx的编译参数 使用nginx -V可以查看,如果编译参数中包含http_ssl_module,可以继续下一步操作,如果没有,则需要从新编译. step 2: 申请证书 目前 ...

  6. MYSQL注入天书之开天辟地

    MYSQL注入天书 在线版本:xianzhi.aliyun.com 第一篇地址:https://xianzhi.aliyun.com/forum/read/314.html第二篇地址:https:// ...

  7. 【最短路径】 SPFA算法优化

    首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...

  8. 为什么我喜欢Java

    我现在的老板使用一个在线测试系统来筛选在线申请职位的求职者.测试的第一个问题很浅显,仅仅是为了让求职者熟悉一下这个系统的提交和测试代码的流程.问题是这样的,写一个将标准输入拷贝到标准输出的流程.求职者 ...

  9. 【LeetCode】shell

    195. Tenth Line 输出file.txt中的第十行 答案: # Read from the file file.txt and output the tenth line to stdou ...

  10. Mac os 下的文件权限管理

    Mac os 下的文件权限管理 命令 ls -l -A 结果 -rw-r--r-- 1 user admin 2326156 4 12 15:24 adb 横线代表空许可.r代表只读,w代表写,x代表 ...