PageSourceSearch

https://ctu-mrs.github.io/assets/js/26942673.d5cc8d9c.js

js ctu-mrs.github.io collected 2026-10-03 08:51:11 UTC 30,593 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkdocusaurus=globalThis.webpackChunkdocusaurus||[]).push([[938],{80354(e,s,a){a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>m,frontMatter:()=>l,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"hardware/cameras/lens_selection","title":"Camera and lens selection guide","description":"This guide will shortly explain how to select a camera + lens for a computer vision application.","source":"@site/versioned_docs/version-1.5.0/100-hardware/cameras/lens_selection.md","sourceDirName":"100-hardware/cameras","slug":"/hardware/cameras/lens_selection","permalink":"/docs/1.5.0/hardware/cameras/lens_selection","draft":false,"unlisted":false,"editUrl":"https://github.com/ctu-mrs/ctu-mrs.github.io/tree/master/versioned_docs/version-1.5.0/100-hardware/cameras/lens_selection.md","tags":[],"version":"1.5.0","frontMatter":{"title":"Camera and lens selection guide"},"sidebar":"sidebar","previous":{"title":"Camera frames","permalink":"/docs/1.5.0/hardware/cameras/camera_frames"},"next":{"title":"LTE connection","permalink":"/docs/1.5.0/hardware/lte_connection"}}');var i=a(74848),t=a(28453);const l={title:"Camera and lens selection guide"},r="A quickstart guide to camera and lens selection for computer vision",c={},o=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"The selection process",id:"the-selection-process",level:2},{value:"Camera sensor selection",id:"camera-sensor-selection",level:3},{value:"Lens selection",id:"lens-selection",level:3},{value:"On wide FoV and other "non-pinhole-like" setups",id:"on-wide-fov-and-other-non-pinhole-like-setups",level:2}];function h(e){const s={a:"a",annotation:"annotation",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",math:"math",mfrac:"mfrac",mi:"mi",mn:"mn",mo:"mo",mrow:"mrow",msub:"msub",ol:"ol",p:"p",semantics:"semantics",span:"span",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"a-quickstart-guide-to-camera-and-lens-selection-for-computer-vision",children:"A quickstart guide to camera and lens selection for computer vision"})}),"\n",(0,i.jsxs)(s.p,{children:["This guide will shortly explain how to select a camera + lens for a computer vision application.\n",(0,i.jsxs)(s.em,{children:["This guide assumes that the optical system may be modelled as a ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Pinhole_camera_model",children:"pinhole camera"})," and the process and the equations get a tad more complicated if this model cannot be used"]})," (ie. when you intend to use special wide-FOV/fisheye/omnidirectional optics - more on this in a later section).\nStill, it should give you a good overview of the problem."]}),"\n",(0,i.jsx)(s.h2,{id:"preliminaries",children:"Preliminaries"}),"\n",(0,i.jsx)(s.p,{children:"In most cases, you want to select an optical imaging system (camera + lens in other words) to comply with one of the following combinations of parameters:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"image resolution, field of view (FOV),"}),"\n",(0,i.jsx)(s.li,{children:"pixel size of an object with a defined size at a specific distance,"}),"\n",(0,i.jsx)(s.li,{children:"image resolution, maximal distortion of the image (how far is the resulting optical system from an ideal pinhole camera)."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Additionally, you usually want to ensure a minimal frame rate, the application dictates if an RGB or monochrome camera is preferred and sometimes a specific connection option is required (USB2, USB3, Ethernet etc.).\nTwo useful conversion equations are:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsxs)(s.mrow,{children:[(0,i.jsxs)(s.msub,{children:[(0,i.jsx)(s.mi,{children:"r"}),(0,i.jsx)(s.mi,{children:"o"})]}),(0,i.jsx)(s.mo,{children:"="}),(0,i.jsxs)(s.mfrac,{children:[(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{children:"r"}),(0,i.jsxs)(s.msub,{children:[(0,i.jsx)(s.mi,{children:"s"}),(0,i.jsx)(s.mi,{children:"o"})]}),(0,i.jsx)(s.mi,{children:"f"})]}),(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{children:"s"}),(0,i.jsx)(s.mo,{stretchy:"false",children:"("}),(0,i.jsx)(s.mi,{children:"d"}),(0,i.jsx)(s.mo,{children:"\u2212"}),(0,i.jsx)(s.mi,{children:"f"}),(0,i.jsx)(s.mo,{stretchy:"false",children:")"})]})]})]}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"r_o=\\frac{rs_of}{s(d-f)}"})]})})}),(0,i.jsxs)(s.span,{className:"katex-html","aria-hidden":"true",children:[(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,i.jsxs)(s.span,{className:"mord",children:[(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"}),(0,i.jsx)(s.span,{className:"msupsub",children:(0,i.jsxs)(s.span,{className:"vlist-t vlist-t2",children:[(0,i.jsxs)(s.span,{className:"vlist-r",children:[(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.1514em"}
1,children:(0,i.jsxs)(s.span,{style:{top:"-2.55em",marginLeft:"-0.0278em",marginRight:"0.05em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"2.7em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"o"})})]})}),(0,i.jsx)(s.span,{className:"vlist-s",children:"\u200b"})]}),(0,i.jsx)(s.span,{className:"vlist-r",children:(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.15em"},children:(0,i.jsx)(s.span,{})})})]})})]}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,i.jsx)(s.span,{className:"mrel",children:"="}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"1.4522em",verticalAlign:"-0.52em"}}),(0,i.jsxs)(s.span,{className:"mord",children:[(0,i.jsx)(s.span,{className:"mopen nulldelimiter"}),(0,i.jsx)(s.span,{className:"mfrac",children:(0,i.jsxs)(s.span,{className:"vlist-t vlist-t2",children:[(0,i.jsxs)(s.span,{className:"vlist-r",children:[(0,i.jsxs)(s.span,{className:"vlist",style:{height:"0.9322em"},children:[(0,i.jsxs)(s.span,{style:{top:"-2.655em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsxs)(s.span,{className:"mord mtight",children:[(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"s"}),(0,i.jsx)(s.span,{className:"mopen mtight",children:"("}),(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"d"}),(0,i.jsx)(s.span,{className:"mbin mtight",children:"\u2212"}),(0,i.jsx)(s.span,{className:"mord mathnormal mtight",style:{marginRight:"0.10764em"},children:"f"}),(0,i.jsx)(s.span,{className:"mclose mtight",children:")"})]})})]}),(0,i.jsxs)(s.span,{style:{top:"-3.23em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,i.jsxs)(s.span,{style:{top:"-3.4461em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsxs)(s.span,{className:"mord mtight",children:[(0,i.jsx)(s.span,{className:"mord mathnormal mtight",style:{marginRight:"0.02778em"},children:"r"}),(0,i.jsxs)(s.span,{className:"mord mtight",children:[(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"s"}),(0,i.jsx)(s.span,{className:"msupsub",children:(0,i.jsxs)(s.span,{className:"vlist-t vlist-t2",children:[(0,i.jsxs)(s.span,{className:"vlist-r",children:[(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.1645em"},children:(0,i.jsxs)(s.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"2.5em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size3 size1 mtight",children:(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"o"})})]})}),(0,i.jsx)(s.span,{className:"vlist-s",children:"\u200b"})]}),(0,i.jsx)(s.span,{className:"vlist-r",children:(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.143em"},children:(0,i.jsx)(s.span,{})})})]})})]}),(0,i.jsx)(s.span,{className:"mord mathnormal mtight",style:{marginRight:"0.10764em"},children:"f"})]})})]})]}),(0,i.jsx)(s.span,{className:"vlist-s",children:"\u200b"})]}),(0,i.jsx)(s.span,{className:"vlist-r",children:(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.52em"},children:(0,i.jsx)(s.span,{})})})]})}),(0,i.jsx)(s.span,{className:"mclose nulldelimiter"})]})]})]})]}),","]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["where ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsx)(s.mrow,{children:(0,i.jsxs)(s.msub,{children:[(0,i.jsx)(s.mi,{children:"r"}),(0,i.jsx)(s.mi,{children:"o"})]})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"r_o"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,i.jsxs)(s.span,{className:"mord",children:[(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"}),(0,i.jsx)(s.span,{className:"msupsub",children:(0,i.jsxs)(s.span,{className:"vlist-t vlist-t2",children:[(0,i.jsxs)(s.span,{className:"vlist-r",children:[(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.1514em"}
1,children:(0,i.jsxs)(s.span,{style:{top:"-2.55em",marginLeft:"-0.0278em",marginRight:"0.05em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"2.7em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"o"})})]})}),(0,i.jsx)(s.span,{className:"vlist-s",children:"\u200b"})]}),(0,i.jsx)(s.span,{className:"vlist-r",children:(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.15em"},children:(0,i.jsx)(s.span,{})})})]})})]})]})})]})," is pixel size of an object with physical size ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsx)(s.mrow,{children:(0,i.jsxs)(s.msub,{children:[(0,i.jsx)(s.mi,{children:"s"}),(0,i.jsx)(s.mi,{children:"o"})]})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"s_o"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,i.jsxs)(s.span,{className:"mord",children:[(0,i.jsx)(s.span,{className:"mord mathnormal",children:"s"}),(0,i.jsx)(s.span,{className:"msupsub",children:(0,i.jsxs)(s.span,{className:"vlist-t vlist-t2",children:[(0,i.jsxs)(s.span,{className:"vlist-r",children:[(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.1514em"},children:(0,i.jsxs)(s.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"2.7em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"o"})})]})}),(0,i.jsx)(s.span,{className:"vlist-s",children:"\u200b"})]}),(0,i.jsx)(s.span,{className:"vlist-r",children:(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.15em"},children:(0,i.jsx)(s.span,{})})})]})})]})]})})]})," which is at distance ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsx)(s.mrow,{children:(0,i.jsx)(s.mi,{children:"d"})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"d"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.6944em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",children:"d"})]})})]})," from the sensor, ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsx)(s.mrow,{children:(0,i.jsx)(s.mi,{children:"r"})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"r"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.4306em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"})]})})]})," is resolution of the sensor, ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsx)(s.mrow,{children:(0,i.jsx)(s.mi,{children:"s"})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"s"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.4306em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",children:"s"})]})})]})," is size of the sensor, and ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsx)(s.mrow,{children:(0,i.jsx)(s.mi,{children:"f"})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"f"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.10764em"},children:"f"})]})})]})," is focal length of the camera."]}),"\n",(0,i.jsxs)(s.ol,{start:"2",children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{children:"F"}),(0,i.jsx)(s.mi,{children:"O"}),(0,i.jsx)(s.mi,{children:"V"}),(0,i.jsx)(s.mo,{children:"="}),(0,i.jsx)(s.mn,{children:"2"}),(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{mathvariant:"normal",children:"a"}),(0,i.jsx)(s.mi,{mathvariant:"normal",children:"t"}),(0,i.jsx)(s.mi,{mathvariant:"normal",children:"a"}),(0,i.jsx)(s.mi,{mathvariant:"normal",children:"n"})]}),(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mo,{fence:"true",children:"("}),(0,i.jsxs)(s.mfrac,{children:[(0,i.jsx)(s.mi,{children:"s"}),(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mn,{children:"2"}),(0,i.jsx)(s.mi,{children:"f"})]})]}),(0,i.jsx)(s.mo,{fence:"true",children:")"})]})]}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"FOV=2\\mathrm{atan}\\left(\\frac{s}{2f}\\right)"})]})})}),(0,i.jsxs)(s.span,{className:"katex-html","aria-hidden":"true",children:[(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.6833em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"FO"}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.22222em"},children:"V"}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,i.jsx)(s.span,{className:"mrel",children:"="}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"1.8em",verticalAlign:"-0.65em"}}),(0,i.jsx)(s.span,{className:"mord",children:"2"}),(0,i.jsx)(s.span,{className:"mord",children:(0,i.jsx)(s.span,{className:"mord mathrm",children:"atan"})}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,i.jsxs)(s.span,{className:"minner",children:[(0,i.jsx)(s.span,{className:"mopen delimcenter",style:{to
1p:"0em"},children:(0,i.jsx)(s.span,{className:"delimsizing size2",children:"("})}),(0,i.jsxs)(s.span,{className:"mord",children:[(0,i.jsx)(s.span,{className:"mopen nulldelimiter"}),(0,i.jsx)(s.span,{className:"mfrac",children:(0,i.jsxs)(s.span,{className:"vlist-t vlist-t2",children:[(0,i.jsxs)(s.span,{className:"vlist-r",children:[(0,i.jsxs)(s.span,{className:"vlist",style:{height:"0.6954em"},children:[(0,i.jsxs)(s.span,{style:{top:"-2.655em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsxs)(s.span,{className:"mord mtight",children:[(0,i.jsx)(s.span,{className:"mord mtight",children:"2"}),(0,i.jsx)(s.span,{className:"mord mathnormal mtight",style:{marginRight:"0.10764em"},children:"f"})]})})]}),(0,i.jsxs)(s.span,{style:{top:"-3.23em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,i.jsxs)(s.span,{style:{top:"-3.394em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"sizing reset-size6 size3 mtight",children:(0,i.jsx)(s.span,{className:"mord mtight",children:(0,i.jsx)(s.span,{className:"mord mathnormal mtight",children:"s"})})})]})]}),(0,i.jsx)(s.span,{className:"vlist-s",children:"\u200b"})]}),(0,i.jsx)(s.span,{className:"vlist-r",children:(0,i.jsx)(s.span,{className:"vlist",style:{height:"0.4811em"},children:(0,i.jsx)(s.span,{})})})]})}),(0,i.jsx)(s.span,{className:"mclose nulldelimiter"})]}),(0,i.jsx)(s.span,{className:"mclose delimcenter",style:{top:"0em"},children:(0,i.jsx)(s.span,{className:"delimsizing size2",children:")"})})]})]})]})]})}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["where ",(0,i.jsxs)(s.span,{className:"katex",children:[(0,i.jsx)(s.span,{className:"katex-mathml",children:(0,i.jsx)(s.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{children:"F"}),(0,i.jsx)(s.mi,{children:"O"}),(0,i.jsx)(s.mi,{children:"V"})]}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"FOV"})]})})}),(0,i.jsx)(s.span,{className:"katex-html","aria-hidden":"true",children:(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"0.6833em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"FO"}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.22222em"},children:"V"})]})})]})," is an angular field of view of the optical imaging system."]}),"\n",(0,i.jsxs)(s.p,{children:["Equations 1. and 2. can be used to convert between the cases.\nHow these equations are obtained from the geometrical layout of the optical imaging system is illustrated in the following image.\nNote that these neglect the aperture size, which is only valid if the aperture is sufficiently small.\nYou can use our ",(0,i.jsx)(s.a,{href:"https://docs.google.com/spreadsheets/d/1WR1ZzsEZVQ7q5Rsaxh-sDTdsqkY4QiFbyPYb-ywzcOM/edit?usp=sharing",children:"handy FoV calculator"})," (optionally including aperture size)."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Illustration of the optical imaging system geometry",src:a(21798).A+"",width:"552",height:"298"})}),"\n",(0,i.jsx)(s.h2,{id:"the-selection-process",children:"The selection process"}),"\n",(0,i.jsx)(s.p,{children:"Typically, the first step is selecting the camera you'll be using and then you select the lens accordingly."}),"\n",(0,i.jsx)(s.h3,{id:"camera-sensor-selection",children:"Camera sensor selection"}),"\n",(0,i.jsx)(s.p,{children:"The camera sensor selection is usually primarily dictated by the desired image resolution, frame rate and connection option.\nOther parameters to pay attention to when selecting a camera are:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://www.flir.com/support-center/iis/machine-vision/knowledge-base/key-differences-between-rolling-shutter-and-frame-global-shutter/",children:"Shutter type"})," (rolling/global):\nIf the camera is intended to be used onboard an MAV or any other moving platform with a source of mechanical vibrations, choose global shutter whenever possible to avoid the ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/R
1olling_shutter",children:"various distortions, caused by a rolling shutter"}),'.\nHowever, global shutter cameras are more complex than "rolling shutter" cameras, which leads to them typically having lower resolution and other adverse properties.\nNote: "global reset" rolling shutter does not remove these problems.']}),"\n",(0,i.jsx)(s.li,{children:"RGB/monochrome:\nThis is probably dictated by the intended application.\nIn general, monochrome (grayscale) cameras have better noise properties than their RGB equivalents.\nPixels of monochrome cameras are sensitive to all colors of the visible spectrum, making them more sensitive to light and thus better suited for low light conditions.\nIn many cases, however, you need RGB image"}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Dynamic_range",children:"Dynamic range"}),":\nThe larger the better will the camera be able to distinguish similar colors.\nThis parameter is dictated by the resolution of the camera's ADC and noise parameters.\nNote: if you intend to use only 8-bit images, then a dynamic range over 50dB will probably not bring much improvement (8 bits correspond to ~48.2dB dynamic range), but you will be throwing away a significant part of the useful information."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://www.flir.com/discover/iis/machine-vision/how-to-evaluate-camera-sensitivity/",children:"Quantum Efficiency"}),":\nDetermines how much of the light hitting the sensor gets converted to a useful electronic signal.\nThis parameter is important if you intend to use the camera in low-light conditions."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Image_sensor_format",children:"Sensor format (size)"}),":\nTypically, the ",(0,i.jsx)(s.code,{children:'1/X"'})," sensor format is used in the datasheets.\nTo convert to a human-readable size of the sensor, use e.g. ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Image_sensor_format#Table_of_sensor_formats_and_sizes",children:"this table"}),".\nA larger sensor typically means a more sensitive sensor.\nThis parameter is important when selecting the lens."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"For the actual selection of a specific camera, I recommend using a camera selector such as:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://www.flir.com/browse/industrial/machine-vision-cameras/modelselector/",children:"Flir camera selector"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://www.baslerweb.com/en/products/tools/vision-system-configurator/#/selection/camera",children:"Basler vision system configurator"})}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://www.matrix-vision.com/camera-selector.html",children:"Matrix-Vision camera selector"})," (manufacturer of BlueFox cameras)"]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Note that different physical camera configurations are usually available with the same sensor model.\nSince the sensor dictates most of the important parameters of the camera (resolution, RGB/monochrome, noise and sensitivity parameters etc.), you can oftentimes select a camera with the same parameters, but eg. different connection or lens mount options."}),"\n",(0,i.jsx)(s.h3,{id:"lens-selection",children:"Lens selection"}),"\n",(0,i.jsx)(s.p,{children:"After you've selected the camera you want to use, it's time for the last step - select the appropriate lens for it.\nThe selected camera dictates the following parameters to which attention has to be paid when selecting the lens:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://www.flir.com/support-center/iis/machine-vision/application-note/selecting-a-lens-for-your-camera/",children:"Lens mount type"}),":\nLimits what lens may be mounted to the camera.\nThere are three common types:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.strong,{children:"C"})," mount. A ",(0,i.jsx)(s.strong,{children:"C"}),"-type lens can easily be used with a ",(0,i.jsx)(s.strong,{children:"CS"}),"-type camera lens mount using a simple reduction ring."]}),"\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.strong,{children:"CS"})," mount. ",(0,i.jsx)(s.strong,{children:"CS"}),"-type lenses are only compatible with ",(0,i.jsx)(s.strong,{children:"CS"}),"-type camera lens mounts and cannot be used with a camera that has a ",(0,i.jsx)(s.strong,{children:"C"})," or ",(0,i.jsx)(s.strong,{children:"M12"})," lens mount."]}),"\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.strong,{children:"M12"})," mount. There are adapters to use a ",(0,i.jsx)(s.strong,{children:"M12"})," lens with a camera that has a ",(0,i.jsx)(s.strong,{children:"C"})," or ",(0,i.jsx)(s.strong,{children:"CS"})," lens mount, but this combination can cause problems and is better avoided."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Resolution:\nQuality of the lens should correspond with the sensor resolution.\nUsing a lens, intended for a 1 mega pixel sensor with a 10 mega pixel sensor may result in blurring of the image in which case a lot of the information that your fancy 10 mega pixel camera could obtain will be useless.\nThe lens vendor should always indicate the intended maximal sensor resolution.\nNote, however, that this rating is about what the manufacturer guarantees - you may get lucky and get lower rated lens that works fine, but don't rely on this."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Image_sensor_format",children:"Sensor format (size)"}),":\nIt is easiest and usually best to simply select a lens, which is intended for the specific sensor format and be done with it.\nIt's possible to use a lens intended for a smaller sensor and get away with it, but this will result in cropping of the image.\nA lens intended for a larger sensor is usually fine, but not all of the projected light will be utilized, and the listed parameters of the lens typically have to be recalculated accordingly (you can use the FoV calculator linked above).\nManufacturers sometimes show in their datasheets what portion of what size of sensor will the image cover."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"on-wide-fov-and-other-non-pinhole-like-setups",children:'O
1n wide FoV and other "non-pinhole-like" setups'}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"Note: May contain controversial information - direct your flame to ViktorWalter"})}),"\n",(0,i.jsxs)(s.p,{children:["Very often, especially for applications of vision onboard of UAVs, you will need cameras with wide FoV to get an overview of the surroundings without the need for actively rotating the camera or the whole UAV.\nThere is now a wide selection of affordable lenses that accomplish this, including ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Fisheye_lens",children:"fisheye lenses"})," with more than 180 degrees FoV, even in small sizes suitable for deployment onboard of UAVs.\nAlternatively, such wide overview can be obtained by using a curved reflective surface in front of a camera sensor.\nFor these cases, the pinhole camera model is not appropriate."]}),"\n",(0,i.jsxs)(s.p,{children:['The pinhole model of cameras is very popular due to its simplicity and presumed computational efficiency.\nIt is used frequently in computer vision and in computer graphics this model is used almost exclusively.\nHowever, it does practically never perfectly correspond to the projection of real cameras that have lenses, because of which most calibration systems based on the pinhole model compute additional "lens distortion" parameters used to first correct the projection to better correspond to the calculated model.\nThis means that additional computation has to be performed anyway and any gains one has from exploiting the math of the pinhole-based perspective projection are rendered pretty much moot.\nI (ViktorWalter) therefore recommend that you consider using a different model than the popular pinhole for better precision in 3D position estimation.\nDefinitely do s
1o for wide FoV optics, but also consider doing this for narrower lenses.\nThere are numerous options of software - one example is the ',(0,i.jsx)(s.a,{href:"https://sites.google.com/site/scarabotix/ocamcalib-toolbox",children:"OCamCalib"})," system."]}),"\n",(0,i.jsxs)(s.p,{children:["When selecting a fisheye lens, refer to ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Fisheye_lens#Mapping_function",children:"this"})," - the mapping function implemented in the optics defines which properties of objects are preserved when they move in the image and which are not. For example, the Equidistant projection preserves angular distances, making it suitable for bearing-based systems."]})]})}function m(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},21798(e,s,a){a.d(s,{A:()=>n});const n=a.p+"assets/images/lens_selection1-db31af82ffbbc518d59ab4cd555bf73a.svg"},28453(e,s,a){a.d(s,{R:()=>l,x:()=>r});var n=a(96540);const i={},t=n.createContext(i);function l(e){const s=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.