[{"data":1,"prerenderedAt":3306},["ShallowReactive",2],{"blog-archive":3},[4,3079],{"id":5,"title":6,"algorithms":7,"author":9,"body":10,"canonical_url":3045,"cover_alt":3046,"cover_image":3046,"demo_url":3046,"description":16,"extension":3047,"featured":2942,"kind":3048,"languages":3049,"learning_objectives":3050,"limitations":3054,"meta":3056,"modified":3057,"navigation":2942,"path":3058,"projects":3059,"published":3057,"relations":3061,"seo":3065,"slug":3066,"source_url":3046,"stem":3067,"summary":3068,"tags":3069,"technologies":3072,"topics":3074,"version":3077,"__hash__":3078},"blog\u002Fblog\u002Fgeometry-of-image-formation.md","The geometry of image formation",[8],"perspective-projection","Lucas Aruodore Adomi",{"type":11,"value":12,"toc":3038},"minimark",[13,17,22,387,679,964,1454,1593,1597,1600,2600,2913,2917,2920,2997,3000,3004,3007,3010,3014,3034],[14,15,16],"p",{},"Computer vision begins with a lossy map. A point in three-dimensional space becomes a point on a two-dimensional sensor, and depth disappears. The familiar projection matrix is compact enough to hide where that loss occurs and which assumptions make the map useful.",[18,19,21],"h2",{"id":20},"four-coordinate-systems-one-observation","Four coordinate systems, one observation",[14,23,24,25,386],{},"Let a world point be ",[26,27,30,109],"span",{"className":28},[29],"katex",[26,31,34],{"className":32},[33],"katex-mathml",[35,36,38],"math",{"xmlns":37},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[39,40,41,104],"semantics",{},[42,43,44,54,58,62,69,73,80,82,89,91,95],"mrow",{},[45,46,47,51],"msub",{},[48,49,50],"mi",{},"P",[48,52,53],{},"w",[55,56,57],"mo",{},"=",[55,59,61],{"stretchy":60},"false","(",[45,63,64,67],{},[48,65,66],{},"X",[48,68,53],{},[55,70,72],{"separator":71},"true",",",[45,74,75,78],{},[48,76,77],{},"Y",[48,79,53],{},[55,81,72],{"separator":71},[45,83,84,87],{},[48,85,86],{},"Z",[48,88,53],{},[55,90,72],{"separator":71},[92,93,94],"mn",{},"1",[96,97,98,101],"msup",{},[55,99,100],{"stretchy":60},")",[48,102,103],{},"T",[105,106,108],"annotation",{"encoding":107},"application\u002Fx-tex","P_w = (X_w, Y_w, Z_w, 1)^T",[26,110,113,194],{"className":111,"ariaHidden":71},[112],"katex-html",[26,114,117,122,182,187,191],{"className":115},[116],"base",[26,118],{"className":119,"style":121},[120],"strut","height:0.8333em;vertical-align:-0.15em;",[26,123,126,131],{"className":124},[125],"mord",[26,127,50],{"className":128,"style":130},[125,129],"mathnormal","margin-right:0.1389em;",[26,132,135],{"className":133},[134],"msupsub",[26,136,140,173],{"className":137},[138,139],"vlist-t","vlist-t2",[26,141,144,168],{"className":142},[143],"vlist-r",[26,145,149],{"className":146,"style":148},[147],"vlist","height:0.1514em;",[26,150,152,157],{"style":151},"top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;",[26,153],{"className":154,"style":156},[155],"pstrut","height:2.7em;",[26,158,164],{"className":159},[160,161,162,163],"sizing","reset-size6","size3","mtight",[26,165,53],{"className":166,"style":167},[125,129,163],"margin-right:0.0269em;",[26,169,172],{"className":170},[171],"vlist-s","​",[26,174,176],{"className":175},[143],[26,177,180],{"className":178,"style":179},[147],"height:0.15em;",[26,181],{},[26,183],{"className":184,"style":186},[185],"mspace","margin-right:0.2778em;",[26,188,57],{"className":189},[190],"mrel",[26,192],{"className":193,"style":186},[185],[26,195,197,201,205,247,251,255,297,300,303,345,348,351,354],{"className":196},[116],[26,198],{"className":199,"style":200},[120],"height:1.0913em;vertical-align:-0.25em;",[26,202,61],{"className":203},[204],"mopen",[26,206,208,212],{"className":207},[125],[26,209,66],{"className":210,"style":211},[125,129],"margin-right:0.0785em;",[26,213,215],{"className":214},[134],[26,216,218,239],{"className":217},[138,139],[26,219,221,236],{"className":220},[143],[26,222,224],{"className":223,"style":148},[147],[26,225,227,230],{"style":226},"top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;",[26,228],{"className":229,"style":156},[155],[26,231,233],{"className":232},[160,161,162,163],[26,234,53],{"className":235,"style":167},[125,129,163],[26,237,172],{"className":238},[171],[26,240,242],{"className":241},[143],[26,243,245],{"className":244,"style":179},[147],[26,246],{},[26,248,72],{"className":249},[250],"mpunct",[26,252],{"className":253,"style":254},[185],"margin-right:0.1667em;",[26,256,258,262],{"className":257},[125],[26,259,77],{"className":260,"style":261},[125,129],"margin-right:0.2222em;",[26,263,265],{"className":264},[134],[26,266,268,289],{"className":267},[138,139],[26,269,271,286],{"className":270},[143],[26,272,274],{"className":273,"style":148},[147],[26,275,277,280],{"style":276},"top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;",[26,278],{"className":279,"style":156},[155],[26,281,283],{"className":282},[160,161,162,163],[26,284,53],{"className":285,"style":167},[125,129,163],[26,287,172],{"className":288},[171],[26,290,292],{"className":291},[143],[26,293,295],{"className":294,"style":179},[147],[26,296],{},[26,298,72],{"className":299},[250],[26,301],{"className":302,"style":254},[185],[26,304,306,310],{"className":305},[125],[26,307,86],{"className":308,"style":309},[125,129],"margin-right:0.0715em;",[26,311,313],{"className":312},[134],[26,314,316,337],{"className":315},[138,139],[26,317,319,334],{"className":318},[143],[26,320,322],{"className":321,"style":148},[147],[26,323,325,328],{"style":324},"top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;",[26,326],{"className":327,"style":156},[155],[26,329,331],{"className":330},[160,161,162,163],[26,332,53],{"className":333,"style":167},[125,129,163],[26,335,172],{"className":336},[171],[26,338,340],{"className":339},[143],[26,341,343],{"className":342,"style":179},[147],[26,344],{},[26,346,72],{"className":347},[250],[26,349],{"className":350,"style":254},[185],[26,352,94],{"className":353},[125],[26,355,358,361],{"className":356},[357],"mclose",[26,359,100],{"className":360},[357],[26,362,364],{"className":363},[134],[26,365,367],{"className":366},[138],[26,368,370],{"className":369},[143],[26,371,374],{"className":372,"style":373},[147],"height:0.8413em;",[26,375,377,380],{"style":376},"top:-3.063em;margin-right:0.05em;",[26,378],{"className":379,"style":156},[155],[26,381,383],{"className":382},[160,161,162,163],[26,384,103],{"className":385,"style":130},[125,129,163],". A rigid transform places it in camera coordinates:",[26,388,391],{"className":389},[390],"katex-display",[26,392,394,460],{"className":393},[29],[26,395,397],{"className":396},[33],[35,398,400],{"xmlns":37,"display":399},"block",[39,401,402,457],{},[42,403,404,411,413,447,453],{},[45,405,406,408],{},[48,407,50],{},[48,409,410],{},"c",[55,412,57],{},[42,414,415,418,444],{},[55,416,417],{"fence":71},"[",[419,420,424],"mtable",{"rowspacing":421,"columnalign":422,"columnspacing":423},"0.16em","center center","1em",[425,426,427,437],"mtr",{},[428,429,430],"mtd",{},[431,432,434],"mstyle",{"scriptlevel":433,"displaystyle":60},"0",[48,435,436],{},"R",[428,438,439],{},[431,440,441],{"scriptlevel":433,"displaystyle":60},[48,442,443],{},"t",[55,445,446],{"fence":71},"]",[45,448,449,451],{},[48,450,50],{},[48,452,53],{},[48,454,456],{"mathvariant":455},"normal",".",[105,458,459],{"encoding":107},"P_c = \\begin{bmatrix}R & t\\end{bmatrix}P_w.",[26,461,463,518],{"className":462,"ariaHidden":71},[112],[26,464,466,469,509,512,515],{"className":465},[116],[26,467],{"className":468,"style":121},[120],[26,470,472,475],{"className":471},[125],[26,473,50],{"className":474,"style":130},[125,129],[26,476,478],{"className":477},[134],[26,479,481,501],{"className":480},[138,139],[26,482,484,498],{"className":483},[143],[26,485,487],{"className":486,"style":148},[147],[26,488,489,492],{"style":151},[26,490],{"className":491,"style":156},[155],[26,493,495],{"className":494},[160,161,162,163],[26,496,410],{"className":497},[125,129,163],[26,499,172],{"className":500},[171],[26,502,504],{"className":503},[143],[26,505,507],{"className":506,"style":179},[147],[26,508],{},[26,510],{"className":511,"style":186},[185],[26,513,57],{"className":514},[190],[26,516],{"className":517,"style":186},[185],[26,519,521,525,633,636,676],{"className":520},[116],[26,522],{"className":523,"style":524},[120],"height:1.2em;vertical-align:-0.35em;",[26,526,529,539,627],{"className":527},[528],"minner",[26,530,534],{"className":531,"style":533},[204,532],"delimcenter","top:0em;",[26,535,417],{"className":536},[537,538],"delimsizing","size1",[26,540,542],{"className":541},[125],[26,543,545,585,590,593],{"className":544},[419],[26,546,549],{"className":547},[548],"col-align-c",[26,550,552,576],{"className":551},[138,139],[26,553,555,573],{"className":554},[143],[26,556,559],{"className":557,"style":558},[147],"height:0.85em;",[26,560,562,566],{"style":561},"top:-3.01em;",[26,563],{"className":564,"style":565},[155],"height:3em;",[26,567,569],{"className":568},[125],[26,570,436],{"className":571,"style":572},[125,129],"margin-right:0.0077em;",[26,574,172],{"className":575},[171],[26,577,579],{"className":578},[143],[26,580,583],{"className":581,"style":582},[147],"height:0.35em;",[26,584],{},[26,586],{"className":587,"style":589},[588],"arraycolsep","width:0.5em;",[26,591],{"className":592,"style":589},[588],[26,594,596],{"className":595},[548],[26,597,599,619],{"className":598},[138,139],[26,600,602,616],{"className":601},[143],[26,603,605],{"className":604,"style":558},[147],[26,606,607,610],{"style":561},[26,608],{"className":609,"style":565},[155],[26,611,613],{"className":612},[125],[26,614,443],{"className":615},[125,129],[26,617,172],{"className":618},[171],[26,620,622],{"className":621},[143],[26,623,625],{"className":624,"style":582},[147],[26,626],{},[26,628,630],{"className":629,"style":533},[357,532],[26,631,446],{"className":632},[537,538],[26,634],{"className":635,"style":254},[185],[26,637,639,642],{"className":638},[125],[26,640,50],{"className":641,"style":130},[125,129],[26,643,645],{"className":644},[134],[26,646,648,668],{"className":647},[138,139],[26,649,651,665],{"className":650},[143],[26,652,654],{"className":653,"style":148},[147],[26,655,656,659],{"style":151},[26,657],{"className":658,"style":156},[155],[26,660,662],{"className":661},[160,161,162,163],[26,663,53],{"className":664,"style":167},[125,129,163],[26,666,172],{"className":667},[171],[26,669,671],{"className":670},[143],[26,672,674],{"className":673,"style":179},[147],[26,675],{},[26,677,456],{"className":678},[125],[14,680,681,682,963],{},"Perspective division then maps ",[26,683,685,735],{"className":684},[29],[26,686,688],{"className":687},[33],[35,689,690],{"xmlns":37},[39,691,692,732],{},[42,693,694,700,702,704,710,712,718,720,726],{},[45,695,696,698],{},[48,697,50],{},[48,699,410],{},[55,701,57],{},[55,703,61],{"stretchy":60},[45,705,706,708],{},[48,707,66],{},[48,709,410],{},[55,711,72],{"separator":71},[45,713,714,716],{},[48,715,77],{},[48,717,410],{},[55,719,72],{"separator":71},[45,721,722,724],{},[48,723,86],{},[48,725,410],{},[96,727,728,730],{},[55,729,100],{"stretchy":60},[48,731,103],{},[105,733,734],{"encoding":107},"P_c = (X_c, Y_c, Z_c)^T",[26,736,738,793],{"className":737,"ariaHidden":71},[112],[26,739,741,744,784,787,790],{"className":740},[116],[26,742],{"className":743,"style":121},[120],[26,745,747,750],{"className":746},[125],[26,748,50],{"className":749,"style":130},[125,129],[26,751,753],{"className":752},[134],[26,754,756,776],{"className":755},[138,139],[26,757,759,773],{"className":758},[143],[26,760,762],{"className":761,"style":148},[147],[26,763,764,767],{"style":151},[26,765],{"className":766,"style":156},[155],[26,768,770],{"className":769},[160,161,162,163],[26,771,410],{"className":772},[125,129,163],[26,774,172],{"className":775},[171],[26,777,779],{"className":778},[143],[26,780,782],{"className":781,"style":179},[147],[26,783],{},[26,785],{"className":786,"style":186},[185],[26,788,57],{"className":789},[190],[26,791],{"className":792,"style":186},[185],[26,794,796,799,802,842,845,848,888,891,894,934],{"className":795},[116],[26,797],{"className":798,"style":200},[120],[26,800,61],{"className":801},[204],[26,803,805,808],{"className":804},[125],[26,806,66],{"className":807,"style":211},[125,129],[26,809,811],{"className":810},[134],[26,812,814,834],{"className":813},[138,139],[26,815,817,831],{"className":816},[143],[26,818,820],{"className":819,"style":148},[147],[26,821,822,825],{"style":226},[26,823],{"className":824,"style":156},[155],[26,826,828],{"className":827},[160,161,162,163],[26,829,410],{"className":830},[125,129,163],[26,832,172],{"className":833},[171],[26,835,837],{"className":836},[143],[26,838,840],{"className":839,"style":179},[147],[26,841],{},[26,843,72],{"className":844},[250],[26,846],{"className":847,"style":254},[185],[26,849,851,854],{"className":850},[125],[26,852,77],{"className":853,"style":261},[125,129],[26,855,857],{"className":856},[134],[26,858,860,880],{"className":859},[138,139],[26,861,863,877],{"className":862},[143],[26,864,866],{"className":865,"style":148},[147],[26,867,868,871],{"style":276},[26,869],{"className":870,"style":156},[155],[26,872,874],{"className":873},[160,161,162,163],[26,875,410],{"className":876},[125,129,163],[26,878,172],{"className":879},[171],[26,881,883],{"className":882},[143],[26,884,886],{"className":885,"style":179},[147],[26,887],{},[26,889,72],{"className":890},[250],[26,892],{"className":893,"style":254},[185],[26,895,897,900],{"className":896},[125],[26,898,86],{"className":899,"style":309},[125,129],[26,901,903],{"className":902},[134],[26,904,906,926],{"className":905},[138,139],[26,907,909,923],{"className":908},[143],[26,910,912],{"className":911,"style":148},[147],[26,913,914,917],{"style":324},[26,915],{"className":916,"style":156},[155],[26,918,920],{"className":919},[160,161,162,163],[26,921,410],{"className":922},[125,129,163],[26,924,172],{"className":925},[171],[26,927,929],{"className":928},[143],[26,930,932],{"className":931,"style":179},[147],[26,933],{},[26,935,937,940],{"className":936},[357],[26,938,100],{"className":939},[357],[26,941,943],{"className":942},[134],[26,944,946],{"className":945},[138],[26,947,949],{"className":948},[143],[26,950,952],{"className":951,"style":373},[147],[26,953,954,957],{"style":376},[26,955],{"className":956,"style":156},[155],[26,958,960],{"className":959},[160,161,162,163],[26,961,103],{"className":962,"style":130},[125,129,163]," to the normalized image plane:",[26,965,967],{"className":966},[390],[26,968,970,1037],{"className":969},[29],[26,971,973],{"className":972},[33],[35,974,975],{"xmlns":37,"display":399},[39,976,977,1034],{},[42,978,979,987,989,1004,1006,1009,1016,1018,1032],{},[45,980,981,984],{},[48,982,983],{},"x",[48,985,986],{},"n",[55,988,57],{},[990,991,992,998],"mfrac",{},[45,993,994,996],{},[48,995,66],{},[48,997,410],{},[45,999,1000,1002],{},[48,1001,86],{},[48,1003,410],{},[55,1005,72],{"separator":71},[185,1007],{"width":1008},"2em",[45,1010,1011,1014],{},[48,1012,1013],{},"y",[48,1015,986],{},[55,1017,57],{},[990,1019,1020,1026],{},[45,1021,1022,1024],{},[48,1023,77],{},[48,1025,410],{},[45,1027,1028,1030],{},[48,1029,86],{},[48,1031,410],{},[48,1033,456],{"mathvariant":455},[105,1035,1036],{"encoding":107},"x_n = \\frac{X_c}{Z_c}, \\qquad y_n = \\frac{Y_c}{Z_c}.",[26,1038,1040,1097,1309],{"className":1039,"ariaHidden":71},[112],[26,1041,1043,1047,1088,1091,1094],{"className":1042},[116],[26,1044],{"className":1045,"style":1046},[120],"height:0.5806em;vertical-align:-0.15em;",[26,1048,1050,1053],{"className":1049},[125],[26,1051,983],{"className":1052},[125,129],[26,1054,1056],{"className":1055},[134],[26,1057,1059,1080],{"className":1058},[138,139],[26,1060,1062,1077],{"className":1061},[143],[26,1063,1065],{"className":1064,"style":148},[147],[26,1066,1068,1071],{"style":1067},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[26,1069],{"className":1070,"style":156},[155],[26,1072,1074],{"className":1073},[160,161,162,163],[26,1075,986],{"className":1076},[125,129,163],[26,1078,172],{"className":1079},[171],[26,1081,1083],{"className":1082},[143],[26,1084,1086],{"className":1085,"style":179},[147],[26,1087],{},[26,1089],{"className":1090,"style":186},[185],[26,1092,57],{"className":1093},[190],[26,1095],{"className":1096,"style":186},[185],[26,1098,1100,1104,1248,1251,1255,1258,1300,1303,1306],{"className":1099},[116],[26,1101],{"className":1102,"style":1103},[120],"height:2.1963em;vertical-align:-0.836em;",[26,1105,1107,1111,1245],{"className":1106},[125],[26,1108],{"className":1109},[204,1110],"nulldelimiter",[26,1112,1114],{"className":1113},[990],[26,1115,1117,1236],{"className":1116},[138,139],[26,1118,1120,1233],{"className":1119},[143],[26,1121,1124,1173,1184],{"className":1122,"style":1123},[147],"height:1.3603em;",[26,1125,1127,1130],{"style":1126},"top:-2.314em;",[26,1128],{"className":1129,"style":565},[155],[26,1131,1133],{"className":1132},[125],[26,1134,1136,1139],{"className":1135},[125],[26,1137,86],{"className":1138,"style":309},[125,129],[26,1140,1142],{"className":1141},[134],[26,1143,1145,1165],{"className":1144},[138,139],[26,1146,1148,1162],{"className":1147},[143],[26,1149,1151],{"className":1150,"style":148},[147],[26,1152,1153,1156],{"style":324},[26,1154],{"className":1155,"style":156},[155],[26,1157,1159],{"className":1158},[160,161,162,163],[26,1160,410],{"className":1161},[125,129,163],[26,1163,172],{"className":1164},[171],[26,1166,1168],{"className":1167},[143],[26,1169,1171],{"className":1170,"style":179},[147],[26,1172],{},[26,1174,1176,1179],{"style":1175},"top:-3.23em;",[26,1177],{"className":1178,"style":565},[155],[26,1180],{"className":1181,"style":1183},[1182],"frac-line","border-bottom-width:0.04em;",[26,1185,1187,1190],{"style":1186},"top:-3.677em;",[26,1188],{"className":1189,"style":565},[155],[26,1191,1193],{"className":1192},[125],[26,1194,1196,1199],{"className":1195},[125],[26,1197,66],{"className":1198,"style":211},[125,129],[26,1200,1202],{"className":1201},[134],[26,1203,1205,1225],{"className":1204},[138,139],[26,1206,1208,1222],{"className":1207},[143],[26,1209,1211],{"className":1210,"style":148},[147],[26,1212,1213,1216],{"style":226},[26,1214],{"className":1215,"style":156},[155],[26,1217,1219],{"className":1218},[160,161,162,163],[26,1220,410],{"className":1221},[125,129,163],[26,1223,172],{"className":1224},[171],[26,1226,1228],{"className":1227},[143],[26,1229,1231],{"className":1230,"style":179},[147],[26,1232],{},[26,1234,172],{"className":1235},[171],[26,1237,1239],{"className":1238},[143],[26,1240,1243],{"className":1241,"style":1242},[147],"height:0.836em;",[26,1244],{},[26,1246],{"className":1247},[357,1110],[26,1249,72],{"className":1250},[250],[26,1252],{"className":1253,"style":1254},[185],"margin-right:2em;",[26,1256],{"className":1257,"style":254},[185],[26,1259,1261,1265],{"className":1260},[125],[26,1262,1013],{"className":1263,"style":1264},[125,129],"margin-right:0.0359em;",[26,1266,1268],{"className":1267},[134],[26,1269,1271,1292],{"className":1270},[138,139],[26,1272,1274,1289],{"className":1273},[143],[26,1275,1277],{"className":1276,"style":148},[147],[26,1278,1280,1283],{"style":1279},"top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;",[26,1281],{"className":1282,"style":156},[155],[26,1284,1286],{"className":1285},[160,161,162,163],[26,1287,986],{"className":1288},[125,129,163],[26,1290,172],{"className":1291},[171],[26,1293,1295],{"className":1294},[143],[26,1296,1298],{"className":1297,"style":179},[147],[26,1299],{},[26,1301],{"className":1302,"style":186},[185],[26,1304,57],{"className":1305},[190],[26,1307],{"className":1308,"style":186},[185],[26,1310,1312,1315,1451],{"className":1311},[116],[26,1313],{"className":1314,"style":1103},[120],[26,1316,1318,1321,1448],{"className":1317},[125],[26,1319],{"className":1320},[204,1110],[26,1322,1324],{"className":1323},[990],[26,1325,1327,1440],{"className":1326},[138,139],[26,1328,1330,1437],{"className":1329},[143],[26,1331,1333,1381,1389],{"className":1332,"style":1123},[147],[26,1334,1335,1338],{"style":1126},[26,1336],{"className":1337,"style":565},[155],[26,1339,1341],{"className":1340},[125],[26,1342,1344,1347],{"className":1343},[125],[26,1345,86],{"className":1346,"style":309},[125,129],[26,1348,1350],{"className":1349},[134],[26,1351,1353,1373],{"className":1352},[138,139],[26,1354,1356,1370],{"className":1355},[143],[26,1357,1359],{"className":1358,"style":148},[147],[26,1360,1361,1364],{"style":324},[26,1362],{"className":1363,"style":156},[155],[26,1365,1367],{"className":1366},[160,161,162,163],[26,1368,410],{"className":1369},[125,129,163],[26,1371,172],{"className":1372},[171],[26,1374,1376],{"className":1375},[143],[26,1377,1379],{"className":1378,"style":179},[147],[26,1380],{},[26,1382,1383,1386],{"style":1175},[26,1384],{"className":1385,"style":565},[155],[26,1387],{"className":1388,"style":1183},[1182],[26,1390,1391,1394],{"style":1186},[26,1392],{"className":1393,"style":565},[155],[26,1395,1397],{"className":1396},[125],[26,1398,1400,1403],{"className":1399},[125],[26,1401,77],{"className":1402,"style":261},[125,129],[26,1404,1406],{"className":1405},[134],[26,1407,1409,1429],{"className":1408},[138,139],[26,1410,1412,1426],{"className":1411},[143],[26,1413,1415],{"className":1414,"style":148},[147],[26,1416,1417,1420],{"style":276},[26,1418],{"className":1419,"style":156},[155],[26,1421,1423],{"className":1422},[160,161,162,163],[26,1424,410],{"className":1425},[125,129,163],[26,1427,172],{"className":1428},[171],[26,1430,1432],{"className":1431},[143],[26,1433,1435],{"className":1434,"style":179},[147],[26,1436],{},[26,1438,172],{"className":1439},[171],[26,1441,1443],{"className":1442},[143],[26,1444,1446],{"className":1445,"style":1242},[147],[26,1447],{},[26,1449],{"className":1450},[357,1110],[26,1452,456],{"className":1453},[125],[14,1455,1456,1457,1592],{},"This division is the essential operation. Points on the same ray from the camera center share ",[26,1458,1460,1490],{"className":1459},[29],[26,1461,1463],{"className":1462},[33],[35,1464,1465],{"xmlns":37},[39,1466,1467,1487],{},[42,1468,1469,1471,1477,1479,1485],{},[55,1470,61],{"stretchy":60},[45,1472,1473,1475],{},[48,1474,983],{},[48,1476,986],{},[55,1478,72],{"separator":71},[45,1480,1481,1483],{},[48,1482,1013],{},[48,1484,986],{},[55,1486,100],{"stretchy":60},[105,1488,1489],{"encoding":107},"(x_n, y_n)",[26,1491,1493],{"className":1492,"ariaHidden":71},[112],[26,1494,1496,1500,1503,1543,1546,1549,1589],{"className":1495},[116],[26,1497],{"className":1498,"style":1499},[120],"height:1em;vertical-align:-0.25em;",[26,1501,61],{"className":1502},[204],[26,1504,1506,1509],{"className":1505},[125],[26,1507,983],{"className":1508},[125,129],[26,1510,1512],{"className":1511},[134],[26,1513,1515,1535],{"className":1514},[138,139],[26,1516,1518,1532],{"className":1517},[143],[26,1519,1521],{"className":1520,"style":148},[147],[26,1522,1523,1526],{"style":1067},[26,1524],{"className":1525,"style":156},[155],[26,1527,1529],{"className":1528},[160,161,162,163],[26,1530,986],{"className":1531},[125,129,163],[26,1533,172],{"className":1534},[171],[26,1536,1538],{"className":1537},[143],[26,1539,1541],{"className":1540,"style":179},[147],[26,1542],{},[26,1544,72],{"className":1545},[250],[26,1547],{"className":1548,"style":254},[185],[26,1550,1552,1555],{"className":1551},[125],[26,1553,1013],{"className":1554,"style":1264},[125,129],[26,1556,1558],{"className":1557},[134],[26,1559,1561,1581],{"className":1560},[138,139],[26,1562,1564,1578],{"className":1563},[143],[26,1565,1567],{"className":1566,"style":148},[147],[26,1568,1569,1572],{"style":1279},[26,1570],{"className":1571,"style":156},[155],[26,1573,1575],{"className":1574},[160,161,162,163],[26,1576,986],{"className":1577},[125,129,163],[26,1579,172],{"className":1580},[171],[26,1582,1584],{"className":1583},[143],[26,1585,1587],{"className":1586,"style":179},[147],[26,1588],{},[26,1590,100],{"className":1591},[357],", so a single image cannot recover their absolute depth without more information.",[18,1594,1596],{"id":1595},"pixels-are-not-normalized-coordinates","Pixels are not normalized coordinates",[14,1598,1599],{},"The intrinsic matrix converts normalized coordinates into sensor coordinates:",[26,1601,1603],{"className":1602},[390],[26,1604,1606,1784],{"className":1605},[29],[26,1607,1609],{"className":1608},[33],[35,1610,1611],{"xmlns":37,"display":399},[39,1612,1613,1781],{},[42,1614,1615,1650,1652,1739,1779],{},[42,1616,1617,1619,1648],{},[55,1618,417],{"fence":71},[419,1620,1622,1631,1640],{"rowspacing":421,"columnalign":1621,"columnspacing":423},"center",[425,1623,1624],{},[428,1625,1626],{},[431,1627,1628],{"scriptlevel":433,"displaystyle":60},[48,1629,1630],{},"u",[425,1632,1633],{},[428,1634,1635],{},[431,1636,1637],{"scriptlevel":433,"displaystyle":60},[48,1638,1639],{},"v",[425,1641,1642],{},[428,1643,1644],{},[431,1645,1646],{"scriptlevel":433,"displaystyle":60},[92,1647,94],{},[55,1649,446],{"fence":71},[55,1651,57],{},[42,1653,1654,1656,1737],{},[55,1655,417],{"fence":71},[419,1657,1659,1689,1717],{"rowspacing":421,"columnalign":1658,"columnspacing":423},"center center center",[425,1660,1661,1672,1679],{},[428,1662,1663],{},[431,1664,1665],{"scriptlevel":433,"displaystyle":60},[45,1666,1667,1670],{},[48,1668,1669],{},"f",[48,1671,983],{},[428,1673,1674],{},[431,1675,1676],{"scriptlevel":433,"displaystyle":60},[48,1677,1678],{},"s",[428,1680,1681],{},[431,1682,1683],{"scriptlevel":433,"displaystyle":60},[45,1684,1685,1687],{},[48,1686,410],{},[48,1688,983],{},[425,1690,1691,1697,1707],{},[428,1692,1693],{},[431,1694,1695],{"scriptlevel":433,"displaystyle":60},[92,1696,433],{},[428,1698,1699],{},[431,1700,1701],{"scriptlevel":433,"displaystyle":60},[45,1702,1703,1705],{},[48,1704,1669],{},[48,1706,1013],{},[428,1708,1709],{},[431,1710,1711],{"scriptlevel":433,"displaystyle":60},[45,1712,1713,1715],{},[48,1714,410],{},[48,1716,1013],{},[425,1718,1719,1725,1731],{},[428,1720,1721],{},[431,1722,1723],{"scriptlevel":433,"displaystyle":60},[92,1724,433],{},[428,1726,1727],{},[431,1728,1729],{"scriptlevel":433,"displaystyle":60},[92,1730,433],{},[428,1732,1733],{},[431,1734,1735],{"scriptlevel":433,"displaystyle":60},[92,1736,94],{},[55,1738,446],{"fence":71},[42,1740,1741,1743,1777],{},[55,1742,417],{"fence":71},[419,1744,1745,1757,1769],{"rowspacing":421,"columnalign":1621,"columnspacing":423},[425,1746,1747],{},[428,1748,1749],{},[431,1750,1751],{"scriptlevel":433,"displaystyle":60},[45,1752,1753,1755],{},[48,1754,983],{},[48,1756,986],{},[425,1758,1759],{},[428,1760,1761],{},[431,1762,1763],{"scriptlevel":433,"displaystyle":60},[45,1764,1765,1767],{},[48,1766,1013],{},[48,1768,986],{},[425,1770,1771],{},[428,1772,1773],{},[431,1774,1775],{"scriptlevel":433,"displaystyle":60},[92,1776,94],{},[55,1778,446],{"fence":71},[48,1780,456],{"mathvariant":455},[105,1782,1783],{"encoding":107},"\\begin{bmatrix}u\\\\v\\\\1\\end{bmatrix}\n=\n\\begin{bmatrix}\nf_x & s & c_x\\\\\n0 & f_y & c_y\\\\\n0 & 0 & 1\n\\end{bmatrix}\n\\begin{bmatrix}x_n\\\\y_n\\\\1\\end{bmatrix}.",[26,1785,1787,1958],{"className":1786,"ariaHidden":71},[112],[26,1788,1790,1794,1949,1952,1955],{"className":1789},[116],[26,1791],{"className":1792,"style":1793},[120],"height:3.6em;vertical-align:-1.55em;",[26,1795,1797,1847,1911],{"className":1796},[528],[26,1798,1800],{"className":1799},[204],[26,1801,1804],{"className":1802},[537,1803],"mult",[26,1805,1807,1838],{"className":1806},[138,139],[26,1808,1810,1835],{"className":1809},[143],[26,1811,1814],{"className":1812,"style":1813},[147],"height:2.05em;",[26,1815,1817,1821],{"style":1816},"top:-4.05em;",[26,1818],{"className":1819,"style":1820},[155],"height:5.6em;",[26,1822,1824],{"style":1823},"width:0.667em;height:3.6em;",[1825,1826,1831],"svg",{"xmlns":1827,"width":1828,"height":1829,"viewBox":1830},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","0.667em","3.6em","0 0 667 3600",[1832,1833],"path",{"d":1834},"M403 1759 V84 H666 V0 H319 V1759 v0 v1759 v84 h347 v-84\nH403z M403 1759 V0 H319 V1759 v0 v1759 v84 h84z",[26,1836,172],{"className":1837},[171],[26,1839,1841],{"className":1840},[143],[26,1842,1845],{"className":1843,"style":1844},[147],"height:1.55em;",[26,1846],{},[26,1848,1850],{"className":1849},[125],[26,1851,1853],{"className":1852},[419],[26,1854,1856],{"className":1855},[548],[26,1857,1859,1903],{"className":1858},[138,139],[26,1860,1862,1900],{"className":1861},[143],[26,1863,1865,1877,1888],{"className":1864,"style":1813},[147],[26,1866,1868,1871],{"style":1867},"top:-4.21em;",[26,1869],{"className":1870,"style":565},[155],[26,1872,1874],{"className":1873},[125],[26,1875,1630],{"className":1876},[125,129],[26,1878,1879,1882],{"style":561},[26,1880],{"className":1881,"style":565},[155],[26,1883,1885],{"className":1884},[125],[26,1886,1639],{"className":1887,"style":1264},[125,129],[26,1889,1891,1894],{"style":1890},"top:-1.81em;",[26,1892],{"className":1893,"style":565},[155],[26,1895,1897],{"className":1896},[125],[26,1898,94],{"className":1899},[125],[26,1901,172],{"className":1902},[171],[26,1904,1906],{"className":1905},[143],[26,1907,1909],{"className":1908,"style":1844},[147],[26,1910],{},[26,1912,1914],{"className":1913},[357],[26,1915,1917],{"className":1916},[537,1803],[26,1918,1920,1941],{"className":1919},[138,139],[26,1921,1923,1938],{"className":1922},[143],[26,1924,1926],{"className":1925,"style":1813},[147],[26,1927,1928,1931],{"style":1816},[26,1929],{"className":1930,"style":1820},[155],[26,1932,1933],{"style":1823},[1825,1934,1935],{"xmlns":1827,"width":1828,"height":1829,"viewBox":1830},[1832,1936],{"d":1937},"M347 1759 V0 H0 V84 H263 V1759 v0 v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v0 v1759 h84z",[26,1939,172],{"className":1940},[171],[26,1942,1944],{"className":1943},[143],[26,1945,1947],{"className":1946,"style":1844},[147],[26,1948],{},[26,1950],{"className":1951,"style":186},[185],[26,1953,57],{"className":1954},[190],[26,1956],{"className":1957,"style":186},[185],[26,1959,1961,1964,2378,2381,2594,2597],{"className":1960},[116],[26,1962],{"className":1963,"style":1793},[120],[26,1965,1967,2004,2341],{"className":1966},[528],[26,1968,1970],{"className":1969},[204],[26,1971,1973],{"className":1972},[537,1803],[26,1974,1976,1996],{"className":1975},[138,139],[26,1977,1979,1993],{"className":1978},[143],[26,1980,1982],{"className":1981,"style":1813},[147],[26,1983,1984,1987],{"style":1816},[26,1985],{"className":1986,"style":1820},[155],[26,1988,1989],{"style":1823},[1825,1990,1991],{"xmlns":1827,"width":1828,"height":1829,"viewBox":1830},[1832,1992],{"d":1834},[26,1994,172],{"className":1995},[171],[26,1997,1999],{"className":1998},[143],[26,2000,2002],{"className":2001,"style":1844},[147],[26,2003],{},[26,2005,2007],{"className":2006},[125],[26,2008,2010,2105,2108,2111,2205,2208,2211],{"className":2009},[419],[26,2011,2013],{"className":2012},[548],[26,2014,2016,2097],{"className":2015},[138,139],[26,2017,2019,2094],{"className":2018},[143],[26,2020,2022,2072,2083],{"className":2021,"style":1813},[147],[26,2023,2024,2027],{"style":1867},[26,2025],{"className":2026,"style":565},[155],[26,2028,2030],{"className":2029},[125],[26,2031,2033,2037],{"className":2032},[125],[26,2034,1669],{"className":2035,"style":2036},[125,129],"margin-right:0.1076em;",[26,2038,2040],{"className":2039},[134],[26,2041,2043,2064],{"className":2042},[138,139],[26,2044,2046,2061],{"className":2045},[143],[26,2047,2049],{"className":2048,"style":148},[147],[26,2050,2052,2055],{"style":2051},"top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;",[26,2053],{"className":2054,"style":156},[155],[26,2056,2058],{"className":2057},[160,161,162,163],[26,2059,983],{"className":2060},[125,129,163],[26,2062,172],{"className":2063},[171],[26,2065,2067],{"className":2066},[143],[26,2068,2070],{"className":2069,"style":179},[147],[26,2071],{},[26,2073,2074,2077],{"style":561},[26,2075],{"className":2076,"style":565},[155],[26,2078,2080],{"className":2079},[125],[26,2081,433],{"className":2082},[125],[26,2084,2085,2088],{"style":1890},[26,2086],{"className":2087,"style":565},[155],[26,2089,2091],{"className":2090},[125],[26,2092,433],{"className":2093},[125],[26,2095,172],{"className":2096},[171],[26,2098,2100],{"className":2099},[143],[26,2101,2103],{"className":2102,"style":1844},[147],[26,2104],{},[26,2106],{"className":2107,"style":589},[588],[26,2109],{"className":2110,"style":589},[588],[26,2112,2114],{"className":2113},[548],[26,2115,2117,2197],{"className":2116},[138,139],[26,2118,2120,2194],{"className":2119},[143],[26,2121,2123,2134,2183],{"className":2122,"style":1813},[147],[26,2124,2125,2128],{"style":1867},[26,2126],{"className":2127,"style":565},[155],[26,2129,2131],{"className":2130},[125],[26,2132,1678],{"className":2133},[125,129],[26,2135,2136,2139],{"style":561},[26,2137],{"className":2138,"style":565},[155],[26,2140,2142],{"className":2141},[125],[26,2143,2145,2148],{"className":2144},[125],[26,2146,1669],{"className":2147,"style":2036},[125,129],[26,2149,2151],{"className":2150},[134],[26,2152,2154,2174],{"className":2153},[138,139],[26,2155,2157,2171],{"className":2156},[143],[26,2158,2160],{"className":2159,"style":148},[147],[26,2161,2162,2165],{"style":2051},[26,2163],{"className":2164,"style":156},[155],[26,2166,2168],{"className":2167},[160,161,162,163],[26,2169,1013],{"className":2170,"style":1264},[125,129,163],[26,2172,172],{"className":2173},[171],[26,2175,2177],{"className":2176},[143],[26,2178,2181],{"className":2179,"style":2180},[147],"height:0.2861em;",[26,2182],{},[26,2184,2185,2188],{"style":1890},[26,2186],{"className":2187,"style":565},[155],[26,2189,2191],{"className":2190},[125],[26,2192,433],{"className":2193},[125],[26,2195,172],{"className":2196},[171],[26,2198,2200],{"className":2199},[143],[26,2201,2203],{"className":2202,"style":1844},[147],[26,2204],{},[26,2206],{"className":2207,"style":589},[588],[26,2209],{"className":2210,"style":589},[588],[26,2212,2214],{"className":2213},[548],[26,2215,2217,2333],{"className":2216},[138,139],[26,2218,2220,2330],{"className":2219},[143],[26,2221,2223,2271,2319],{"className":2222,"style":1813},[147],[26,2224,2225,2228],{"style":1867},[26,2226],{"className":2227,"style":565},[155],[26,2229,2231],{"className":2230},[125],[26,2232,2234,2237],{"className":2233},[125],[26,2235,410],{"className":2236},[125,129],[26,2238,2240],{"className":2239},[134],[26,2241,2243,2263],{"className":2242},[138,139],[26,2244,2246,2260],{"className":2245},[143],[26,2247,2249],{"className":2248,"style":148},[147],[26,2250,2251,2254],{"style":1067},[26,2252],{"className":2253,"style":156},[155],[26,2255,2257],{"className":2256},[160,161,162,163],[26,2258,983],{"className":2259},[125,129,163],[26,2261,172],{"className":2262},[171],[26,2264,2266],{"className":2265},[143],[26,2267,2269],{"className":2268,"style":179},[147],[26,2270],{},[26,2272,2273,2276],{"style":561},[26,2274],{"className":2275,"style":565},[155],[26,2277,2279],{"className":2278},[125],[26,2280,2282,2285],{"className":2281},[125],[26,2283,410],{"className":2284},[125,129],[26,2286,2288],{"className":2287},[134],[26,2289,2291,2311],{"className":2290},[138,139],[26,2292,2294,2308],{"className":2293},[143],[26,2295,2297],{"className":2296,"style":148},[147],[26,2298,2299,2302],{"style":1067},[26,2300],{"className":2301,"style":156},[155],[26,2303,2305],{"className":2304},[160,161,162,163],[26,2306,1013],{"className":2307,"style":1264},[125,129,163],[26,2309,172],{"className":2310},[171],[26,2312,2314],{"className":2313},[143],[26,2315,2317],{"className":2316,"style":2180},[147],[26,2318],{},[26,2320,2321,2324],{"style":1890},[26,2322],{"className":2323,"style":565},[155],[26,2325,2327],{"className":2326},[125],[26,2328,94],{"className":2329},[125],[26,2331,172],{"className":2332},[171],[26,2334,2336],{"className":2335},[143],[26,2337,2339],{"className":2338,"style":1844},[147],[26,2340],{},[26,2342,2344],{"className":2343},[357],[26,2345,2347],{"className":2346},[537,1803],[26,2348,2350,2370],{"className":2349},[138,139],[26,2351,2353,2367],{"className":2352},[143],[26,2354,2356],{"className":2355,"style":1813},[147],[26,2357,2358,2361],{"style":1816},[26,2359],{"className":2360,"style":1820},[155],[26,2362,2363],{"style":1823},[1825,2364,2365],{"xmlns":1827,"width":1828,"height":1829,"viewBox":1830},[1832,2366],{"d":1937},[26,2368,172],{"className":2369},[171],[26,2371,2373],{"className":2372},[143],[26,2374,2376],{"className":2375,"style":1844},[147],[26,2377],{},[26,2379],{"className":2380,"style":254},[185],[26,2382,2384,2421,2557],{"className":2383},[528],[26,2385,2387],{"className":2386},[204],[26,2388,2390],{"className":2389},[537,1803],[26,2391,2393,2413],{"className":2392},[138,139],[26,2394,2396,2410],{"className":2395},[143],[26,2397,2399],{"className":2398,"style":1813},[147],[26,2400,2401,2404],{"style":1816},[26,2402],{"className":2403,"style":1820},[155],[26,2405,2406],{"style":1823},[1825,2407,2408],{"xmlns":1827,"width":1828,"height":1829,"viewBox":1830},[1832,2409],{"d":1834},[26,2411,172],{"className":2412},[171],[26,2414,2416],{"className":2415},[143],[26,2417,2419],{"className":2418,"style":1844},[147],[26,2420],{},[26,2422,2424],{"className":2423},[125],[26,2425,2427],{"className":2426},[419],[26,2428,2430],{"className":2429},[548],[26,2431,2433,2549],{"className":2432},[138,139],[26,2434,2436,2546],{"className":2435},[143],[26,2437,2439,2487,2535],{"className":2438,"style":1813},[147],[26,2440,2441,2444],{"style":1867},[26,2442],{"className":2443,"style":565},[155],[26,2445,2447],{"className":2446},[125],[26,2448,2450,2453],{"className":2449},[125],[26,2451,983],{"className":2452},[125,129],[26,2454,2456],{"className":2455},[134],[26,2457,2459,2479],{"className":2458},[138,139],[26,2460,2462,2476],{"className":2461},[143],[26,2463,2465],{"className":2464,"style":148},[147],[26,2466,2467,2470],{"style":1067},[26,2468],{"className":2469,"style":156},[155],[26,2471,2473],{"className":2472},[160,161,162,163],[26,2474,986],{"className":2475},[125,129,163],[26,2477,172],{"className":2478},[171],[26,2480,2482],{"className":2481},[143],[26,2483,2485],{"className":2484,"style":179},[147],[26,2486],{},[26,2488,2489,2492],{"style":561},[26,2490],{"className":2491,"style":565},[155],[26,2493,2495],{"className":2494},[125],[26,2496,2498,2501],{"className":2497},[125],[26,2499,1013],{"className":2500,"style":1264},[125,129],[26,2502,2504],{"className":2503},[134],[26,2505,2507,2527],{"className":2506},[138,139],[26,2508,2510,2524],{"className":2509},[143],[26,2511,2513],{"className":2512,"style":148},[147],[26,2514,2515,2518],{"style":1279},[26,2516],{"className":2517,"style":156},[155],[26,2519,2521],{"className":2520},[160,161,162,163],[26,2522,986],{"className":2523},[125,129,163],[26,2525,172],{"className":2526},[171],[26,2528,2530],{"className":2529},[143],[26,2531,2533],{"className":2532,"style":179},[147],[26,2534],{},[26,2536,2537,2540],{"style":1890},[26,2538],{"className":2539,"style":565},[155],[26,2541,2543],{"className":2542},[125],[26,2544,94],{"className":2545},[125],[26,2547,172],{"className":2548},[171],[26,2550,2552],{"className":2551},[143],[26,2553,2555],{"className":2554,"style":1844},[147],[26,2556],{},[26,2558,2560],{"className":2559},[357],[26,2561,2563],{"className":2562},[537,1803],[26,2564,2566,2586],{"className":2565},[138,139],[26,2567,2569,2583],{"className":2568},[143],[26,2570,2572],{"className":2571,"style":1813},[147],[26,2573,2574,2577],{"style":1816},[26,2575],{"className":2576,"style":1820},[155],[26,2578,2579],{"style":1823},[1825,2580,2581],{"xmlns":1827,"width":1828,"height":1829,"viewBox":1830},[1832,2582],{"d":1937},[26,2584,172],{"className":2585},[171],[26,2587,2589],{"className":2588},[143],[26,2590,2592],{"className":2591,"style":1844},[147],[26,2593],{},[26,2595],{"className":2596,"style":254},[185],[26,2598,456],{"className":2599},[125],[14,2601,2602,2603,2674,2675,2746,2747,2882,2883,2912],{},"The focal lengths ",[26,2604,2606,2624],{"className":2605},[29],[26,2607,2609],{"className":2608},[33],[35,2610,2611],{"xmlns":37},[39,2612,2613,2621],{},[42,2614,2615],{},[45,2616,2617,2619],{},[48,2618,1669],{},[48,2620,983],{},[105,2622,2623],{"encoding":107},"f_x",[26,2625,2627],{"className":2626,"ariaHidden":71},[112],[26,2628,2630,2634],{"className":2629},[116],[26,2631],{"className":2632,"style":2633},[120],"height:0.8889em;vertical-align:-0.1944em;",[26,2635,2637,2640],{"className":2636},[125],[26,2638,1669],{"className":2639,"style":2036},[125,129],[26,2641,2643],{"className":2642},[134],[26,2644,2646,2666],{"className":2645},[138,139],[26,2647,2649,2663],{"className":2648},[143],[26,2650,2652],{"className":2651,"style":148},[147],[26,2653,2654,2657],{"style":2051},[26,2655],{"className":2656,"style":156},[155],[26,2658,2660],{"className":2659},[160,161,162,163],[26,2661,983],{"className":2662},[125,129,163],[26,2664,172],{"className":2665},[171],[26,2667,2669],{"className":2668},[143],[26,2670,2672],{"className":2671,"style":179},[147],[26,2673],{}," and ",[26,2676,2678,2696],{"className":2677},[29],[26,2679,2681],{"className":2680},[33],[35,2682,2683],{"xmlns":37},[39,2684,2685,2693],{},[42,2686,2687],{},[45,2688,2689,2691],{},[48,2690,1669],{},[48,2692,1013],{},[105,2694,2695],{"encoding":107},"f_y",[26,2697,2699],{"className":2698,"ariaHidden":71},[112],[26,2700,2702,2706],{"className":2701},[116],[26,2703],{"className":2704,"style":2705},[120],"height:0.9805em;vertical-align:-0.2861em;",[26,2707,2709,2712],{"className":2708},[125],[26,2710,1669],{"className":2711,"style":2036},[125,129],[26,2713,2715],{"className":2714},[134],[26,2716,2718,2738],{"className":2717},[138,139],[26,2719,2721,2735],{"className":2720},[143],[26,2722,2724],{"className":2723,"style":148},[147],[26,2725,2726,2729],{"style":2051},[26,2727],{"className":2728,"style":156},[155],[26,2730,2732],{"className":2731},[160,161,162,163],[26,2733,1013],{"className":2734,"style":1264},[125,129,163],[26,2736,172],{"className":2737},[171],[26,2739,2741],{"className":2740},[143],[26,2742,2744],{"className":2743,"style":2180},[147],[26,2745],{}," are measured in pixels. The principal point ",[26,2748,2750,2780],{"className":2749},[29],[26,2751,2753],{"className":2752},[33],[35,2754,2755],{"xmlns":37},[39,2756,2757,2777],{},[42,2758,2759,2761,2767,2769,2775],{},[55,2760,61],{"stretchy":60},[45,2762,2763,2765],{},[48,2764,410],{},[48,2766,983],{},[55,2768,72],{"separator":71},[45,2770,2771,2773],{},[48,2772,410],{},[48,2774,1013],{},[55,2776,100],{"stretchy":60},[105,2778,2779],{"encoding":107},"(c_x, c_y)",[26,2781,2783],{"className":2782,"ariaHidden":71},[112],[26,2784,2786,2790,2793,2833,2836,2839,2879],{"className":2785},[116],[26,2787],{"className":2788,"style":2789},[120],"height:1.0361em;vertical-align:-0.2861em;",[26,2791,61],{"className":2792},[204],[26,2794,2796,2799],{"className":2795},[125],[26,2797,410],{"className":2798},[125,129],[26,2800,2802],{"className":2801},[134],[26,2803,2805,2825],{"className":2804},[138,139],[26,2806,2808,2822],{"className":2807},[143],[26,2809,2811],{"className":2810,"style":148},[147],[26,2812,2813,2816],{"style":1067},[26,2814],{"className":2815,"style":156},[155],[26,2817,2819],{"className":2818},[160,161,162,163],[26,2820,983],{"className":2821},[125,129,163],[26,2823,172],{"className":2824},[171],[26,2826,2828],{"className":2827},[143],[26,2829,2831],{"className":2830,"style":179},[147],[26,2832],{},[26,2834,72],{"className":2835},[250],[26,2837],{"className":2838,"style":254},[185],[26,2840,2842,2845],{"className":2841},[125],[26,2843,410],{"className":2844},[125,129],[26,2846,2848],{"className":2847},[134],[26,2849,2851,2871],{"className":2850},[138,139],[26,2852,2854,2868],{"className":2853},[143],[26,2855,2857],{"className":2856,"style":148},[147],[26,2858,2859,2862],{"style":1067},[26,2860],{"className":2861,"style":156},[155],[26,2863,2865],{"className":2864},[160,161,162,163],[26,2866,1013],{"className":2867,"style":1264},[125,129,163],[26,2869,172],{"className":2870},[171],[26,2872,2874],{"className":2873},[143],[26,2875,2877],{"className":2876,"style":2180},[147],[26,2878],{},[26,2880,100],{"className":2881},[357]," describes where the optical axis meets the sensor. The skew ",[26,2884,2886,2899],{"className":2885},[29],[26,2887,2889],{"className":2888},[33],[35,2890,2891],{"xmlns":37},[39,2892,2893,2897],{},[42,2894,2895],{},[48,2896,1678],{},[105,2898,1678],{"encoding":107},[26,2900,2902],{"className":2901,"ariaHidden":71},[112],[26,2903,2905,2909],{"className":2904},[116],[26,2906],{"className":2907,"style":2908},[120],"height:0.4306em;",[26,2910,1678],{"className":2911},[125,129]," is usually set to zero for modern sensors, but removing it is an assumption rather than an algebraic fact.",[18,2914,2916],{"id":2915},"an-implementation-that-preserves-the-stages","An implementation that preserves the stages",[14,2918,2919],{},"Compact matrix multiplication is convenient in production. During development, keeping the stages visible makes frame mistakes easier to find.",[2921,2922,2927],"pre",{"className":2923,"code":2924,"language":2925,"meta":2926,"style":2926},"language-python shiki shiki-themes github-light github-dark","import numpy as np\n\ndef project(point_world, rotation, translation, intrinsics):\n    point_camera = rotation @ point_world + translation\n    if point_camera[2] \u003C= 0:\n        raise ValueError(\"point lies on or behind the camera plane\")\n\n    normalized = point_camera[:2] \u002F point_camera[2]\n    homogeneous = np.array([normalized[0], normalized[1], 1.0])\n    pixel = intrinsics @ homogeneous\n    return pixel[:2]\n","python","",[2928,2929,2930,2937,2944,2950,2956,2962,2968,2973,2979,2985,2991],"code",{"__ignoreMap":2926},[26,2931,2934],{"class":2932,"line":2933},"line",1,[26,2935,2936],{},"import numpy as np\n",[26,2938,2940],{"class":2932,"line":2939},2,[26,2941,2943],{"emptyLinePlaceholder":2942},true,"\n",[26,2945,2947],{"class":2932,"line":2946},3,[26,2948,2949],{},"def project(point_world, rotation, translation, intrinsics):\n",[26,2951,2953],{"class":2932,"line":2952},4,[26,2954,2955],{},"    point_camera = rotation @ point_world + translation\n",[26,2957,2959],{"class":2932,"line":2958},5,[26,2960,2961],{},"    if point_camera[2] \u003C= 0:\n",[26,2963,2965],{"class":2932,"line":2964},6,[26,2966,2967],{},"        raise ValueError(\"point lies on or behind the camera plane\")\n",[26,2969,2971],{"class":2932,"line":2970},7,[26,2972,2943],{"emptyLinePlaceholder":2942},[26,2974,2976],{"class":2932,"line":2975},8,[26,2977,2978],{},"    normalized = point_camera[:2] \u002F point_camera[2]\n",[26,2980,2982],{"class":2932,"line":2981},9,[26,2983,2984],{},"    homogeneous = np.array([normalized[0], normalized[1], 1.0])\n",[26,2986,2988],{"class":2932,"line":2987},10,[26,2989,2990],{},"    pixel = intrinsics @ homogeneous\n",[26,2992,2994],{"class":2932,"line":2993},11,[26,2995,2996],{},"    return pixel[:2]\n",[14,2998,2999],{},"The explicit depth check matters. Algebra alone will happily project a point behind the camera into a plausible pixel coordinate.",[18,3001,3003],{"id":3002},"what-the-matrix-leaves-out","What the matrix leaves out",[14,3005,3006],{},"Real cameras depart from this model. Radial and tangential lens distortion alter the mapping, rolling shutters expose rows at different times, and calibration parameters drift with focus and temperature. The pinhole camera is still the correct starting point because it separates projective geometry from those corrections.",[14,3008,3009],{},"The next step is not a larger matrix. It is a clear residual model: measure how observed pixels depart from the ideal projection, then decide which physical effects are worth estimating.",[18,3011,3013],{"id":3012},"further-reading","Further reading",[3015,3016,3017,3025,3031],"ul",{},[3018,3019,3020,3021,456],"li",{},"Richard Hartley and Andrew Zisserman, ",[3022,3023,3024],"em",{},"Multiple View Geometry in Computer Vision",[3018,3026,3027,3028,456],{},"Richard Szeliski, ",[3022,3029,3030],{},"Computer Vision: Algorithms and Applications",[3018,3032,3033],{},"The related notebook entry records a coordinate-normalization error that initially looked like poor calibration.",[3035,3036,3037],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":2926,"searchDepth":2946,"depth":2946,"links":3039},[3040,3041,3042,3043,3044],{"id":20,"depth":2939,"text":21},{"id":1595,"depth":2939,"text":1596},{"id":2915,"depth":2939,"text":2916},{"id":3002,"depth":2939,"text":3003},{"id":3012,"depth":2939,"text":3013},"https:\u002F\u002Fjournal.aruodore.com\u002Fblog\u002Fgeometry-of-image-formation",null,"md","exposition",[2925],[3051,3052,3053],"Move cleanly between world, camera, normalized image, and pixel coordinates.","Identify which calibration assumptions are encoded in the intrinsic matrix.","Recognize the numerical failure modes hidden by compact projection notation.",[3055],"The pinhole model does not describe lens distortion or rolling shutter.",{},"2026-08-04","\u002Fblog\u002Fgeometry-of-image-formation",[3060],"vision-geometry",[3062],{"type":3063,"target":3064},"develops","notebook:2026:normalizing-camera-coordinates",{"title":6,"description":16},"geometry-of-image-formation","blog\u002Fgeometry-of-image-formation","A practical derivation of the pinhole camera model, its coordinate systems, and the assumptions hidden inside a projection matrix.",[3070,3071],"camera-models","projection",[3073],"opencv",[3075,3076],"computer-vision","geometry","1.0.0","0hdpn3sCElEQouNtGightW4-Y2dI23RYj954bwdsh70",{"id":3080,"title":3081,"algorithms":3082,"author":9,"body":3083,"canonical_url":3272,"cover_alt":3046,"cover_image":3046,"demo_url":3046,"description":3087,"extension":3047,"featured":2942,"kind":3273,"languages":3274,"learning_objectives":3275,"limitations":3279,"meta":3281,"modified":3282,"navigation":2942,"path":3283,"projects":3284,"published":3286,"relations":3287,"seo":3290,"slug":3291,"source_url":3046,"stem":3292,"summary":3293,"tags":3294,"technologies":3298,"topics":3301,"version":3304,"__hash__":3305},"blog\u002Fblog\u002Freproducible-gpu-benchmarks.md","A benchmark is an experimental record",[],{"type":11,"value":3084,"toc":3265},[3085,3088,3092,3095,3098,3102,3105,3169,3172,3176,3179,3246,3250,3253,3256,3260,3263],[14,3086,3087],{},"A benchmark result is not a number. It is a number attached to an environment, a protocol, raw observations, and a question. Remove any one of those and the result becomes difficult to interpret. Remove several and it becomes decoration.",[18,3089,3091],{"id":3090},"begin-with-the-decision","Begin with the decision",[14,3093,3094],{},"“Which implementation is faster?” is incomplete. A useful benchmark names the workload and the decision it supports. Latency for batch size one, throughput under saturation, memory pressure during training, and energy per inference are different experiments.",[14,3096,3097],{},"The metric follows the decision. It should not be chosen because it produces the largest ratio.",[18,3099,3101],{"id":3100},"synchronization-changes-the-measurement","Synchronization changes the measurement",[14,3103,3104],{},"CUDA kernels are dispatched asynchronously. Timing only the Python call often measures queue submission rather than device execution.",[2921,3106,3108],{"className":2923,"code":3107,"language":2925,"meta":2926,"style":2926},"import time\nimport torch\n\ndef timed_run(operation, samples=30):\n    observations = []\n    for _ in range(samples):\n        torch.cuda.synchronize()\n        started = time.perf_counter_ns()\n        operation()\n        torch.cuda.synchronize()\n        observations.append(time.perf_counter_ns() - started)\n    return observations\n",[2928,3109,3110,3115,3120,3124,3129,3134,3139,3144,3149,3154,3158,3163],{"__ignoreMap":2926},[26,3111,3112],{"class":2932,"line":2933},[26,3113,3114],{},"import time\n",[26,3116,3117],{"class":2932,"line":2939},[26,3118,3119],{},"import torch\n",[26,3121,3122],{"class":2932,"line":2946},[26,3123,2943],{"emptyLinePlaceholder":2942},[26,3125,3126],{"class":2932,"line":2952},[26,3127,3128],{},"def timed_run(operation, samples=30):\n",[26,3130,3131],{"class":2932,"line":2958},[26,3132,3133],{},"    observations = []\n",[26,3135,3136],{"class":2932,"line":2964},[26,3137,3138],{},"    for _ in range(samples):\n",[26,3140,3141],{"class":2932,"line":2970},[26,3142,3143],{},"        torch.cuda.synchronize()\n",[26,3145,3146],{"class":2932,"line":2975},[26,3147,3148],{},"        started = time.perf_counter_ns()\n",[26,3150,3151],{"class":2932,"line":2981},[26,3152,3153],{},"        operation()\n",[26,3155,3156],{"class":2932,"line":2987},[26,3157,3143],{},[26,3159,3160],{"class":2932,"line":2993},[26,3161,3162],{},"        observations.append(time.perf_counter_ns() - started)\n",[26,3164,3166],{"class":2932,"line":3165},12,[26,3167,3168],{},"    return observations\n",[14,3170,3171],{},"Synchronization is not free, so the measured region must be documented. Device events are preferable when the question is strictly kernel execution. End-to-end wall time is preferable when host overhead is part of the user experience.",[18,3173,3175],{"id":3174},"keep-the-distribution","Keep the distribution",[14,3177,3178],{},"Thirty observations contain information that their mean discards. Report the median, an interval, and the raw values. A violin or empirical cumulative distribution can reveal multimodality caused by thermal behavior, compilation, or background work.",[3180,3181,3182,3198],"table",{},[3183,3184,3185],"thead",{},[3186,3187,3188,3192,3195],"tr",{},[3189,3190,3191],"th",{},"Field",[3189,3193,3194],{},"Example value",[3189,3196,3197],{},"Why it matters",[3199,3200,3201,3213,3224,3235],"tbody",{},[3186,3202,3203,3207,3210],{},[3204,3205,3206],"td",{},"Warmups",[3204,3208,3209],{},"10",[3204,3211,3212],{},"Excludes compilation and initial allocation",[3186,3214,3215,3218,3221],{},[3204,3216,3217],{},"Samples",[3204,3219,3220],{},"30",[3204,3222,3223],{},"Exposes run-to-run variation",[3186,3225,3226,3229,3232],{},[3204,3227,3228],{},"Statistic",[3204,3230,3231],{},"Median",[3204,3233,3234],{},"Resists a small number of long stalls",[3186,3236,3237,3240,3243],{},[3204,3238,3239],{},"Interval",[3204,3241,3242],{},"Bootstrap 95%",[3204,3244,3245],{},"Communicates estimation uncertainty",[18,3247,3249],{"id":3248},"preserve-the-environment","Preserve the environment",[14,3251,3252],{},"Record the device model, driver, runtime, dependency lock hash, operating system, power policy, precision, shapes, dataset version, and full command. Reference source by immutable commit. Raw result files should use a run identifier and checksum.",[14,3254,3255],{},"A future result should be compared automatically only when the methodology declares the runs compatible. Otherwise, show both records and explain the environmental differences.",[18,3257,3259],{"id":3258},"the-honest-conclusion","The honest conclusion",[14,3261,3262],{},"Benchmarks are valuable when they narrow a decision. “Implementation A was faster under this protocol” is stronger than an unsupported universal claim. The caveat does not weaken the work. It tells the reader where the evidence applies.",[3035,3264,3037],{},{"title":2926,"searchDepth":2946,"depth":2946,"links":3266},[3267,3268,3269,3270,3271],{"id":3090,"depth":2939,"text":3091},{"id":3100,"depth":2939,"text":3101},{"id":3174,"depth":2939,"text":3175},{"id":3248,"depth":2939,"text":3249},{"id":3258,"depth":2939,"text":3259},"https:\u002F\u002Fjournal.aruodore.com\u002Fblog\u002Freproducible-gpu-benchmarks","benchmark",[2925],[3276,3277,3278],"Separate device execution time from asynchronous host dispatch.","Report distributions and uncertainty rather than one attractive number.","Package enough environment data for a later comparison.",[3280],"The examples focus on a single-device inference workload.",{},"2026-08-01","\u002Fblog\u002Freproducible-gpu-benchmarks",[3285],"benchmark-protocol","2026-07-21",[3288],{"type":3063,"target":3289},"notebook:2026:gpu-synchronization-changed-the-result",{"title":3081,"description":3087},"reproducible-gpu-benchmarks","blog\u002Freproducible-gpu-benchmarks","GPU timing numbers become useful only when hardware, synchronization, sampling, and raw observations remain attached to the result.",[3295,3296,3297],"gpu","reproducibility","performance",[3299,3300],"pytorch","cuda",[3302,3303],"scientific-computing","ai-engineering","1.1.0","GRfaGNg-Ub0yV-3qI3Q4zuB-BhqGmACoDIqe9nqJToo",1785815463682]