1"use strict";(self.webpackChunkwiki=self.webpackChunkwiki||[]).push([["3850"],{13560(e,s,a){a.r(s),a.d(s,{metadata:()=>n,default:()=>d,frontMatter:()=>r,contentTitle:()=>l,toc:()=>h,assets:()=>c});var n=JSON.parse('{"id":"computer-vision/3d-reconstruction/stereo-matching","title":"Stereo Matching","description":"Rectified stereo pair \u304B\u3089 disparity map \u3092\u63A8\u5B9A\u3057\u3001depth \u306B\u5909\u63DB\u3059\u308B Stereo Matching \u3092\u6574\u7406\u3057\u307E\u3059\u3002","source":"@site/docs/computer-vision/3d-reconstruction/stereo-matching.mdx","sourceDirName":"computer-vision/3d-reconstruction","slug":"/computer-vision/3d-reconstruction/stereo-matching","permalink":"/wiki/computer-vision/3d-reconstruction/stereo-matching","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"title":"Stereo Matching","description":"Rectified stereo pair \u304B\u3089 disparity map \u3092\u63A8\u5B9A\u3057\u3001depth \u306B\u5909\u63DB\u3059\u308B Stereo Matching \u3092\u6574\u7406\u3057\u307E\u3059\u3002"},"sidebar":"tutorialSidebar","previous":{"title":"Optical Flow","permalink":"/wiki/computer-vision/3d-reconstruction/optical-flow"},"next":{"title":"Depth Estimation","permalink":"/wiki/computer-vision/3d-reconstruction/depth-estimation"}}'),i=a(74848),t=a(28453);let r={sidebar_position:6,title:"Stereo Matching",description:"Rectified stereo pair \u304B\u3089 disparity map \u3092\u63A8\u5B9A\u3057\u3001depth \u306B\u5909\u63DB\u3059\u308B Stereo Matching \u3092\u6574\u7406\u3057\u307E\u3059\u3002"},l="Stereo Matching",c={},h=[{value:"Stereo geometry",id:"stereo-geometry",level:2},{value:"Classical stereo matching",id:"classical-stereo-matching",level:2},{value:"Learning-based stereo",id:"learning-based-stereo",level:2},{value:"\u96E3\u3057\u3044\u30B1\u30FC\u30B9",id:"\u96E3\u3057\u3044\u30B1\u30FC\u30B9",level:2},{value:"Depth Estimation \u3068\u306E\u95A2\u4FC2",id:"depth-estimation-\u3068\u306E\u95A2\u4FC2",level:2},{value:"\u95A2\u9023\u30DA\u30FC\u30B8",id:"\u95A2\u9023\u30DA\u30FC\u30B8",level:2},{value:"\u4E3B\u306A\u30BD\u30FC\u30B9",id:"\u4E3B\u306A\u30BD\u30FC\u30B9",level:2}];function m(e){let s={a:"a",annotation:"annotation",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",math:"math",mfrac:"mfrac",mi:"mi",mo:"mo",mrow:"mrow",p:"p",pre:"pre",semantics:"semantics",span:"span",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:"stereo-matching",children:"Stereo Matching"})}),"\n",(0,i.jsx)(s.p,{children:"Stereo Matching \u306F\u3001\u5DE6\u53F3\u306E camera image \u306E\u9593\u3067 pixel-level correspondence \u3092\u6C42\u3081\u3001disparity map \u3092\u63A8\u5B9A\u3059\u308B task \u3067\u3059\u3002Stereo depth\u3001robotics\u3001autonomous driving\u3001MVS \u306E\u57FA\u790E\u306B\u306A\u308A\u307E\u3059\u3002"}),"\n",(0,i.jsx)(s.h2,{id:"stereo-geometry",children:"Stereo geometry"}),"\n",(0,i.jsxs)(s.p,{children:["Calibrated stereo camera \u3067\u306F\u3001\u5DE6\u53F3 camera \u306E baseline ",(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:"B"})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"B"})]})})}),(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.0502em"},children:"B"})]})})]})," \u3068 focal length ",(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.1076em"},children:"f"})]})})]})," \u304C\u65E2\u77E5\u3067\u3059\u3002Rectification \u5F8C\u306E stereo pair \u3067\u306F\u3001\u5BFE\u5FDC\u70B9\u63A2\u7D22\u306F\u540C\u3058 scanline \u4E0A\u306E\u4E00\u6B21\u5143\u63A2\u7D22\u306B\u306A\u308A\u307E\u3059\u3002"]}),"\n",(0,i.jsxs)(s.p,{children:["Left image \u306E pixel ",(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.mo,{stretchy:"false",children:"("}),(0,i.jsx)(s.mi,{children:"u"}),(0,i.jsx)(s.mo,{separator:"true",children:","}),(0,i.jsx)(s.mi,{children:"v"}),(0,i.jsx)(s.mo,{stretchy:"false",children:")"})]}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"(u, v)"})]})})}),(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:"1em",verticalAlign:"-0.25em"}}),(0,i.jsx)(s.span,{className:"mopen",children:"("}),(0,i.jsx)(s.span,{className:"mord mathnormal",children:"u"}),(0,i.jsx)(s.span,{className:"mpunct",children:","}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.0359em"},children:"v"}),(0,i.jsx)(s.span,{className:"mclose",children:")"})]})})]})," \u306B\u5BFE\u5FDC\u3059\u308B right image \u306E pixel \u304C ",(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.mo,{stretchy:"false",children:"("}),(0,i.jsx)(s.mi,{children:"u"}),(0,i.jsx)(s.mo,{children:"\u2212"}),(0,i.jsx)(s.mi,{children:"d"}),(0,i.jsx)(s.mo,{separator:"true",children:","}),(0,i.jsx)(s.mi,{children:"v"}),(0,i.jsx)(s.mo,{stretchy:"false",children:")"})]}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"(u - d, v)"})]})})}),(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:"1em",verticalAlign:"-0.25em"}}),(0,i.jsx)(s.span,{className:"mopen",children:"("}),(0,i.jsx)(s.span,{className:"mord mathnormal",children:"u"}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,i.jsx)(s.span,{className:"mbin",children:"\u2212"}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,i.jsxs)(s.span,{className:"base",children:[(0,i.jsx)(s.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",children:"d"}),(0,i.jsx)(s.span,{className:"mpunct",children:","}),(0,i.jsx)(s.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.0359em"},children:"v"}),(0,i.jsx)(s.span,{className:"mclose",children:")"})]})]})]})," \u3067\u3042\u308B\u3068\u304D\u3001",(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"})]})})]}
1)," \u304C disparity \u3067\u3059\u3002Depth ",(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:"Z"})}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"Z"})]})})}),(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.0715em"},children:"Z"})]})})]})," \u306F\u6B21\u306E\u5F0F\u3067\u5F97\u3089\u308C\u307E\u3059\u3002"]}),"\n",(0,i.jsx)(s.span,{className:"katex-display",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",display:"block",children:(0,i.jsxs)(s.semantics,{children:[(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{children:"Z"}),(0,i.jsx)(s.mo,{children:"="}),(0,i.jsxs)(s.mfrac,{children:[(0,i.jsxs)(s.mrow,{children:[(0,i.jsx)(s.mi,{children:"f"}),(0,i.jsx)(s.mi,{children:"B"})]}),(0,i.jsx)(s.mi,{children:"d"})]})]}),(0,i.jsx)(s.annotation,{encoding:"application/x-tex",children:"Z = \\frac{fB}{d}"})]})})}),(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.0715em"},children:"Z"}),(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:"2.0574em",verticalAlign:"-0.686em"}}),(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:"1.3714em"},children:[(0,i.jsxs)(s.span,{style:{top:"-2.314em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsx)(s.span,{className:"mord",children:(0,i.jsx)(s.span,{className:"mord mathnormal",children:"d"})})]}),(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.677em"},children:[(0,i.jsx)(s.span,{className:"pstrut",style:{height:"3em"}}),(0,i.jsxs)(s.span,{className:"mord",children:[(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.1076em"},children:"f"}),(0,i.jsx)(s.span,{className:"mord mathnormal",style:{marginRight:"0.0502em"},children:"B"})]})]})]}),(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.686em"},children:(0,i.jsx)(s.span,{})})})]})}),(0,i.jsx)(s.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,i.jsx)(s.p,{children:"Disparity \u304C\u5927\u304D\u3044\u70B9\u307B\u3069 camera \u306B\u8FD1\u304F\u3001disparity \u304C\u5C0F\u3055\u3044\u70B9\u307B\u3069\u9060\u304F\u306B\u3042\u308A\u307E\u3059\u3002"}),"\n",(0,i.jsx)(s.h2,{id:"classical-stereo-matching",children:"Classical stereo matching"}),"\n",(0,i.jsx)(s.p,{children:"Classical stereo matching \u306F\u3001\u4E00\u822C\u306B\u6B21\u306E\u6D41\u308C\u3067\u884C\u308F\u308C\u307E\u3059\u3002"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-text",children:"stereo calibration\n -> rectification\n -> matching cost computation\n -> cost aggregation\n -> disparity optimization\n -> post-processing / filtering\n"})}),"\n",(0,i.jsxs)(s.p,{children:["\u4EE3\u8868\u7684\u306A method \u306B\u306F\u3001Block Matching\uFF08BM\uFF09\u3084 Semi-Global Matching\uFF08SGM / SGBM\uFF09\u304C\u3042\u308A\u307E\u3059\u3002OpenCV \u3067\u306F ",(0,i.jsx)(s.code,{children:"StereoBM"})," \u3068 ",(0,i.jsx)(s.code,{children:"StereoSGBM"})," \u304C\u63D0\u4F9B\u3055\u308C\u3066\u3044\u307E\u3059\u3002"]}),"\n",(0,i.jsx)(s.h2,{id:"learning-based-stereo",children:"Learning-based stereo"}),"\n",(0,i.jsx)(s.p,{children:"Deep learning \u306B\u3088\u308B stereo matching \u3067\u306F\u3001feature extraction \u3068 cost volume construction \u3092 neural network \u3067\u884C\u3044\u307E\u3059\u3002Cost volume \u306F\u3001candidate disparity \u3054\u3068\u306B\u5DE6\u53F3 image \u306E feature similarity \u3092\u683C\u7D0D\u3057\u305F volume \u3067\u3059\u3002"}
1),"\n",(0,i.jsx)(s.p,{children:"\u8FD1\u5E74\u306E method \u306F\u30013D convolution\u3001recurrent refinement\u3001RAFT-like iterative update \u306A\u3069\u3092\u4F7F\u3063\u3066\u3001sub-pixel \u7CBE\u5EA6\u306E disparity \u3092\u63A8\u5B9A\u3057\u307E\u3059\u3002"}),"\n",(0,i.jsx)(s.h2,{id:"\u96E3\u3057\u3044\u30B1\u30FC\u30B9",children:"\u96E3\u3057\u3044\u30B1\u30FC\u30B9"}),"\n",(0,i.jsx)(s.p,{children:"Stereo Matching \u306F\u3001\u6B21\u306E\u3088\u3046\u306A\u9818\u57DF\u3067\u96E3\u3057\u304F\u306A\u308A\u307E\u3059\u3002"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Textureless region"}),"\n",(0,i.jsx)(s.li,{children:"Repetitive pattern"}),"\n",(0,i.jsx)(s.li,{children:"Specular / transparent surface"}),"\n",(0,i.jsx)(s.li,{children:"Occlusion boundary"}),"\n",(0,i.jsx)(s.li,{children:"Thin structure"}),"\n",(0,i.jsx)(s.li,{children:"Large disparity"}),"\n",(0,i.jsx)(s.li,{children:"Calibration error"}),"\n",(0,i.jsx)(s.li,{children:"Exposure difference between cameras"}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"depth-estimation-\u3068\u306E\u95A2\u4FC2",children:"Depth Estimation \u3068\u306E\u95A2\u4FC2"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/wiki/computer-vision/3d-reconstruction/depth-estimation",children:"Stereo depth"})," \u306F\u3001Stereo Matching \u3067\u5F97\u305F disparity \u3092 depth \u306B\u5909\u63DB\u3059\u308B\u3053\u3068\u3067\u5F97\u3089\u308C\u307E\u3059\u3002Monocular depth \u3068\u9055\u3044\u3001calibration \u3068 baseline \u304C\u6B63\u78BA\u3067\u3042\u308C\u3070 metric scale \u3092\u76F4\u63A5\u5F97\u3089\u308C\u308B\u70B9\u304C\u5927\u304D\u306A\u5229\u70B9\u3067\u3059\u3002"]}),"\n",(0,i.jsx)(s.h2,{id:"\u95A2\u9023\u30DA\u30FC\u30B8",children:"\u95A2\u9023\u30DA\u30FC\u30B8"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/wiki/computer-vision/3d-reconstruction/depth-estimation",children:"Depth Estimation"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/wiki/computer-vision/3d-reconstruction/epipolar-geometry",children:"Epipolar Geometry"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/wiki/computer-vision/3d-reconstruction/feature-matching",children:"Feature Matching"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/wiki/computer-vision/3d-reconstruction/multi-view-stereo",children:"Multi-View Stereo"})}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"\u4E3B\u306A\u30BD\u30FC\u30B9",children:"\u4E3B\u306A\u30BD\u30FC\u30B9"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["OpenCV StereoMatcher documentation: ",(0,i.jsx)(s.a,{href:"https://docs.opencv.org/master/d2/d6e/classcv_1_1StereoMatcher.html",children:"https://docs.opencv.org/master/d2/d6e/classcv_1_1StereoMatcher.html"})]}),"\n",(0,i.jsxs)(s.li,{children:["OpenCV disparity / depth map tutorial: ",(0,i.jsx)(s.a,{href:"https://docs.opencv.org/4.x/dd/d53/tutorial_py_depthmap.html",children:"https://docs.opencv.org/4.x/dd/d53/tutorial_py_depthmap.html"})]}),"\n",(0,i.jsxs)(s.li,{children:["Hirschm\xfcller, \u201CStereo Processing by Semi-Global Matching and Mutual Information\u201D, 2005: ",(0,i.jsx)(s.a,{href:"https://ieeexplore.ieee.org/document/1467526",children:"https://ieeexplore.ieee.org/document/1467526"})]}),"\n",(0,i.jsxs)(s.li,{children:["Middlebury Stereo benchmark: ",(0,i.jsx)(s.a,{href:"https://vision.middlebury.edu/stereo/",children:"https://vision.middlebury.edu/stereo/"})]}),"\n",(0,i.jsxs)(s.li,{children:["KITTI Stereo benchmark: ",(0,i.jsx)(s.a,{href:"https://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=stereo",children:"https://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=stereo"})]}),"\n"]})]})}function d(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}},28453(e,s,a){a.d(s,{R:()=>r,x:()=>l});var n=a(96540);let i={},t=n.createContext(i);function r(e){let s=n.useContext(t);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(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.