三维滤波反投影重建算法 3D reconstruction 有哪些实用算法

网站已改版,请使用新地址访问:
old-3d-reconstruction-code-master 三维重建的一些常用算法,包括摄像头标定,双目匹配、计算视差、 的 Special Effects 图形图像处理 274万源代码下载-
&文件名称: old-3d-reconstruction-code-master& & [
& & & & &&]
&&所属分类:
&&开发工具: C++
&&文件大小: 257 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:三维重建的一些常用算法,包括摄像头标定,双目匹配、计算视差、三维重建等常用的算法-Some commonly used three-dimensional reconstruction algorithms, including camera calibration, matching eyes, the parallax calculation, 3D reconstruction algorithm commonly used
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&old-3d-reconstruction-code-master&&.................................\.gitignore&&.................................\CMakeLists.txt&&.................................\INSTALL&&.................................\LICENSE&&.................................\README&&.................................\cmake&&.................................\.....\FindEigen3.cmake&&.................................\doc&&.................................\...\Doxyfile&&.................................\lib&&.................................\...\Audio&&.................................\...\.....\CMakeLists.txt&&.................................\...\CMakeLists.txt&&.................................\...\Core&&.................................\...\....\CMakeLists.txt&&.................................\...\....\Data.cpp&&.................................\...\....\Data.h&&.................................\...\....\Event.cpp&&.................................\...\....\Event.h&&.................................\...\....\Fact.cpp&&.................................\...\....\Fact.h&&.................................\...\....\Object.cpp&&.................................\...\....\Object.h&&.................................\...\Framework&&.................................\...\.........\CMakeLists.txt&&.................................\...\Language&&.................................\...\........\CMakeLists.txt&&.................................\...\........\Context.cpp&&.................................\...\........\Context.h&&.................................\...\........\Expression.cpp&&.................................\...\........\Expression.h&&.................................\...\Math&&.................................\...\....\CMakeLists.txt&&.................................\...\....\Calculus&&.................................\...\....\........\Antiderivative.cpp&&.................................\...\....\........\Antiderivative.h&&.................................\...\....\........\CMakeLists.txt&&.................................\...\....\........\Derivative.cpp&&.................................\...\....\........\Derivative.h&&.................................\...\....\........\IFunction.cpp&&.................................\...\....\........\IFunction.h&&.................................\...\....\........\Integral.cpp&&.................................\...\....\........\Integral.h&&.................................\...\....\........\Jacobian.cpp&&.................................\...\....\........\Jacobian.h&&.................................\...\....\........\PartialDerivative.cpp&&.................................\...\....\........\PartialDerivative.h&&.................................\...\....\Core&&.................................\...\....\....\CMakeLists.txt&&.................................\...\....\....\Number.cpp&&.................................\...\....\....\Number.h&&.................................\...\....\LinearAlgebra&&.................................\...\....\.............\CMakeLists.txt&&.................................\...\....\.............\Field.cpp&&.................................\...\....\.............\Field.h&&.................................\...\....\.............\Matrix.cpp&&.................................\...\....\.............\Matrix.h&&.................................\...\....\.............\QRDecomposition.cpp&&.................................\...\....\.............\QRDecomposition.h&&.................................\...\....\.............\Vector.cpp&&.................................\...\....\.............\Vector.h&&.................................\...\....\.............\VectorSpace.cpp&&.................................\...\....\.............\VectorSpace.h&&.................................\...\....\Optimization&&.................................\...\....\............\CMakeLists.txt&&.................................\...\....\............\LevenbergMarquardt.cpp&&.................................\...\....\............\LevenbergMarquardt.h&&.................................\...\....\Statistics&&.................................\...\....\..........\CMakeLists.txt&&.................................\...\....\..........\RANSAC.cpp&&.................................\...\....\..........\RANSAC.h&&.................................\...\Vision&&.................................\...\......\CMakeLists.txt&&.................................\...\......\Core&&.................................\...\......\....\CMakeLists.txt&&.................................\...\......\....\CameraParameters.cpp&&.................................\...\......\....\CameraParameters.h&&.................................\...\......\....\Feature.cpp&&.................................\...\......\....\Feature.h&&.................................\...\......\....\FeatureSet.cpp&&.................................\...\......\....\FeatureSet.h&&.................................\...\......\....\ICamera.cpp&&.................................\...\......\....\ICamera.h&&.................................\...\......\....\IImage.cpp&&.................................\...\......\....\IImage.h&&.................................\...\......\....\Point.cpp&&.................................\...\......\....\Point.h&&.................................\...\......\....\PointCloud.cpp&&.................................\...\......\....\PointCloud.h&&.................................\...\......\....\PointOfView.cpp&&.................................\...\......\....\PointOfView.h&&.................................\...\......\....\Projection.cpp&&.................................\...\......\....\Projection.h&&.................................\...\......\....\Scene.cpp&&.................................\...\......\....\Scene.h&&.................................\...\......\....\SingleViewCamera.cpp&&.................................\...\......\....\SingleViewCamera.h&&.................................\...\......\....\SingleViewImage.cpp&&.................................\...\......\....\SingleViewImage.h
&输入关键字,在本站274万海量源码库中尽情搜索:3d reconstruction global registration是什么意思_百度知道
3d reconstruction global registration是什么意思
我有更好的答案
reconstruction global registration_有道翻译翻译结果:全面重建的岳父
采纳率:95%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&p&打个擦边球,最近我lead的国家级大学生创(hua)新(shui)创(xian)业(yu)项目快结题了,做的是基于&b&医学CT切层扫描的肝部三维重建。&/b&最后还要可视化,就是把肝部的三维模型渲染出来,这样子的画我们团队选择的解决方案就是&b&重建出三角形网格&/b&再基于我的迷你3d引擎用传统方法渲染。&/p&&p&.&/p&&h2&&b&1,CT断层扫描&/b&&/h2&&figure&&img src=&/v2-3dfaa465079cce09c58e8d0_b.jpg& data-rawwidth=&600& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-3dfaa465079cce09c58e8d0_r.jpg&&&/figure&&p&&a href=&///?target=http%3A///link%3Furl%3DeVfqy8z39TRI21a_B9eia0mlS_AyXOqKJl9ul3Mt6puIpt3B1Z2uDnQkMWokgwpl6Dwavy08RPT3YT10gKcIW_& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CT(电子计算机断层扫描)_百度百科&i class=&icon-external&&&/i&&/a&&/p&&blockquote&CT(Computed Tomography),即电子计算机断层扫描,它是利用精确准直的X线束、γ射线、超声波等,与灵敏度极高的探测器一同围绕人体的某一部位作一个接一个的断面扫描,具有扫描时间快,图像清晰等特点,可用于多种疾病的检查;根据所采用的射线不同可分为:&u&&a href=&///?target=http%3A///item/X%25E5%25B0%%25BA%25BF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&X射线&i class=&icon-external&&&/i&&/a&&/u&CT(X-CT)、超声CT(UCT)以及&u&&a href=&///?target=http%3A///item/%25CE%25B3%25E5%25B0%%25BA%25BF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&γ射线&i class=&icon-external&&&/i&&/a&&/u&CT(γ-CT)等。&/blockquote&&p&.&/p&&p&反正要做一次CT扫描,就整个人躺在那,从那个洞里经过,全身过一遍。然后就能得到全身几十或者几百张CT扫描断层。(想象把一个人切成几百片吧,但是CT扫描只是像一系列采样而已,而且数据是灰度图)&/p&&figure&&img src=&/v2-fd2e6aead5c4ae_b.jpg& data-rawwidth=&600& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-fd2e6aead5c4ae_r.jpg&&&/figure&&br&&figure&&img src=&/v2-c34a349d3cc69ba16e7a57e_b.jpg& data-rawwidth=&1783& data-rawheight=&1329& class=&origin_image zh-lightbox-thumb& width=&1783& data-original=&/v2-c34a349d3cc69ba16e7a57e_r.jpg&&&/figure&&p&一般的CT图就长上面的样子,上面的图大概就是在腰或者胸附近切的几刀(= =我也不知是哪,专业人士轻喷)虽然真的CT图会有更多信息,但其实就把它当&b&灰度图&/b&看就好了,CT值和器官密度什么的在这个项目就不管了。&/p&&p&.&/p&&p&.&/p&&h2&2,肝部识别&/h2&&br&&figure&&img src=&/v2-2ff7fd9e8f422a08a239df_b.jpg& data-rawwidth=&600& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-2ff7fd9e8f422a08a239df_r.jpg&&&/figure&&br&&p&这个不是本回答的重点,只说两句。师兄说要像上图那样标出目标器官大致区域和前后景区域,然后用openCV里的grabCut来把目标区域挖出来,这样精度会相对高一点。把目标区域挖出来以后就对图像&b&二值化&/b&再保存成文件,&b&属于肝的像素是1,背景是0&/b&。&/p&&p&!!!!!!!!然后这个才是重点!!!!!!!!!!&/p&&p&.&/p&&p&.&/p&&h2&&b&3,基于MarchingCube算法的三维重建&/b&&/h2&&p&这个方法最早在1987年就在论文《Marching Cubes : A High Resolution 3D Surface Construction Algorithm》中被Willian E. Lorensen 和Harvey E. Cline共同提出[1],论文里还特别地提到了一下医学影像的3d表面重建的基本流程。(ps:这论文到现在已经1.2万引用了,害怕)因为我看论文并没有非常仔细,所以有些细节可能跟这篇经典论文有出入,但是大致还是没问题的,毕竟MarchingCubes算法&b&我觉得是一个算法框架,可以有非常多的变体算法来适应自己的项目&/b&。&/p&&p&首先,Marching Cube有个迷之中文翻译,叫“&b&移动立方体算法&/b&”。所以从名字就能大概能看出了,这个三维重建的算法是一个&b&&u&分治&/u&&/b&的算法(divide and conquer)。(虽然“移动”这个词是有点迷)。&/p&&p&我们先想象一下,用一个超大的长方体&b&包住目标物体&/b&(就是目标器官必须完全地位于大长方体内部)。再把这个大长方体,分成 A x B x C个一模一样的小长方体。&/p&&br&&figure&&img src=&/v2-09bf6da0b8a5ddf77af048b24aebf3d8_b.jpg& data-rawwidth=&800& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-09bf6da0b8a5ddf77af048b24aebf3d8_r.jpg&&&/figure&&br&&p&其中,每个&b&平行于水平面的长方体截面就对应着一个CT断层图片(的一部分)&/b&。&/p&&br&&figure&&img src=&/v2-1d21a99f0a3b1b089a854ba9adc688eb_b.jpg& data-rawwidth=&800& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-1d21a99f0a3b1b089a854ba9adc688eb_r.jpg&&&/figure&&br&&p&上图是我灵性p的一张示意图,示意着某个小长方体与和它相邻两个CT截面之间的关系。&/p&&p&所以,这个“分而治之”的&b&基本单元就是一个小立方体&/b&,这么做其实相当于是三维空间上的重采样,所以你要分成多少个长方体其实你可以自己定的。下一个思想也是比较关键的,就是&b&&u&判断小立方体的8个顶点分别是否在目标器官的内部&/u&&/b&。如果某个顶点在物体内部,那么给这个顶点标上一个0;如果这顶点在物体外部,则给它标上一个1。好了那么怎么判断某个顶点在不在目标器官内部呢?这就用上了&b&上一个步骤得到的二值化图&/b&,直接看图的对应位置是不是1就好了(刚才不是说了图像处理步骤得到的结果,目标器官的区域的像素就标为1)。&/p&&p&.&/p&&p&之后我们根据图片判断出8个顶点的“0”与“1”。排列组合就有2^8=256种情况。每一种情况,我们可以在小立方体内生成一些&b&&u&等值面&/u&&/b&,或者理解成生成&b&&u&0个或多个位于立方体内部的三角形&/u&&/b&。对,一共有256种局部三角形的组成的情况。&/p&&p&为了针对某个小立方体去生成局部三角形,MarchingCubes非常丧心病狂地做了一件事:&b&&u&穷举了256种情况能生成的三角形&/u&&/b&。(虽然,这256种情况可以&b&被概括成15个基本情况&/b&,基本情况经过旋转、镜像等操作可以生成所有的256种情况)。&/p&&br&&figure&&img src=&/v2-aa1edfb1a4c5f8ab54e02_b.jpg& data-rawwidth=&520& data-rawheight=&721& class=&origin_image zh-lightbox-thumb& width=&520& data-original=&/v2-aa1edfb1a4c5f8ab54e02_r.jpg&&&/figure&&br&&p&上图就是引用自1987年论文[1]里面的图,图里描述了15种基本情况。上图基本说说明了,什么情况就可以在哪生成三角形。其中&b&三角形的每个顶点都是在小立方体的棱上&/b&的。于是每&b&&u&个小立方体都这么干,所有小立方体生成的三角形拼在一起就是目标器官的表面了&/u&&/b&。&/p&&p&(ps : 这种穷举法的描述里面是会有&b&二义性(Ambiguity)&/b&的情况存在,在这里不展开讲)&/p&&p&.&/p&&p&论文这么说是很舒服的,代码写起来一点都不舒服好吧。于是就稍微参考了下VTK (Visualization Toolkit)的MC模块的源码,可以上github找去,这库还是很强的。然而看别人代码,而且是没什么注释的代码真的难受,所以还是自己写了。&b&只不过VTK这个模块的代码有段很值钱的代码,对,就是那个穷举256种情况的数组。&/b&&/p&&br&&figure&&img src=&/v2-fd0d15491eed44d7edb71ae91e40ac34_b.jpg& data-rawwidth=&1237& data-rawheight=&839& class=&origin_image zh-lightbox-thumb& width=&1237& data-original=&/v2-fd0d15491eed44d7edb71ae91e40ac34_r.jpg&&&/figure&&br&&p&上图我把VTK里那个珍贵的数组复制了过来=。=不知道有没有侵权,嘘&/p&&br&&figure&&img src=&/v2-dcaa84cb78ef08_b.jpg& data-rawwidth=&516& data-rawheight=&495& class=&origin_image zh-lightbox-thumb& width=&516& data-original=&/v2-dcaa84cb78ef08_r.jpg&&&/figure&&br&&p&仔细把那个数组和上面论文里的图的v1-v8, e1-e12 对比了一下,发现是没问题的,VTK就是按论文的定义去实现的,注意下标的起始数字就行了。&/p&&p&.&/p&&p&.&/p&&h2&4, &b&MarchingCube三维重建效果图&/b&&/h2&&br&&figure&&img src=&/v2-0cd0ea6ee10_b.png& data-rawwidth=&634& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&634& data-original=&/v2-0cd0ea6ee10_r.png&&&/figure&&br&&figure&&img src=&/v2-ba5de59ea25adcd403788_b.jpg& data-rawwidth=&1200& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-ba5de59ea25adcd403788_r.jpg&&&/figure&&br&&p&我的天,丑的吓人!但是这个丑讲道理是不能甩锅给MarchingCube的,要怪就怪图像识别做的不怎么样:)。(但在MarchingCube算法生成的模型还是比较多的明显锯齿)。&/p&&p&所以最后折衷一下做个网格简化吧!&/p&&br&&figure&&img src=&/v2-762436eaaf6da4f80b38c94d984cb824_b.jpg& data-rawwidth=&1200& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-762436eaaf6da4f80b38c94d984cb824_r.jpg&&&/figure&&br&&figure&&img src=&/v2-8bf7e9a39e11c39fbc5c9eedc32d0a77_b.jpg& data-rawwidth=&1200& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-8bf7e9a39e11c39fbc5c9eedc32d0a77_r.jpg&&&/figure&&br&&p&好多了好多了!&/p&&br&&br&update1:有个小想法,如果曲面重建的source data是散乱点云,那可以把三维点正投影到最近的水平切片上,然后用2D Delaunay三角剖分在切片上重建出一个三角形组成的二维填充区域,然后接下来进行上述步骤,感觉也能重建出曲面=。=&br&.&p&我写的MarchingCube算法代码放在了github上:&/p&&p&&u&&a href=&///?target=https%3A///CHINA-JIGE/MarchingCube& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/CHINA-JIGE/M&/span&&span class=&invisible&&archingCube&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/u&&/p&&p&--------------------------------------------------------------------------------&/p&&p&引用:&/p&&p&[1]Lorensen W E, Cline H E. Marching cubes: A high resolution 3D surface construction algorithm[J]. Acm Siggraph Computer Graphics, ):163--169.&/p&
打个擦边球,最近我lead的国家级大学生创(hua)新(shui)创(xian)业(yu)项目快结题了,做的是基于医学CT切层扫描的肝部三维重建。最后还要可视化,就是把肝部的三维模型渲染出来,这样子的画我们团队选择的解决方案就是重建出三角形网格再基于我的迷你3d引擎…
手头使用动态规划做的还行,置信传播据说效果很好但是目前没调出来特别好的参数体系。&a href=&///?target=http%3A//vision.middlebury.edu/stereo& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&vision.middlebury.edu/s&/span&&span class=&invisible&&tereo&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&上可以去参考一下。
手头使用动态规划做的还行,置信传播据说效果很好但是目前没调出来特别好的参数体系。上可以去参考一下。
Richard Hartley与Andrew Zisserman合著的Multiple View Geometry in Computer Vision
Richard Hartley与Andrew Zisserman合著的Multiple View Geometry in Computer Vision
简历发这pu.&br&==================================================&br&&br&我讲一下用一组图片来做3D reconstruction需要的算法吧(SFM), 使用这种方法的软件比较代表性的有 Pix4Dmapper, Autodesk 123D Catch, PhotoModeler, VisualSFM&br&&br&我用JavaScript撸了个WebSFM, 完全用Javascript实现的3D reconstruction系统,可以在浏览器里跑.&br&&br&&figure&&img src=&/b1e2d072c9f3e06b2ce4124e6fdb53a5_b.jpg& data-rawwidth=&1920& data-rawheight=&1053& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/b1e2d072c9f3e06b2ce4124e6fdb53a5_r.jpg&&&/figure&&br&&a href=&///?target=http%3A//websfm.org& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&websfm.org&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& , 用Chrome,Firefox,IE10+打开即可.&br&&br&pipeline大致是:&br&先用SIFT对每张照片提取特征,再对每一对图片做鲁棒的特征匹配,将所有2图匹配合并,找出track,通过tracks估算相机参数场景的稀疏结构, 再用相机参数做dense reconstruction, 输出dense point cloud (with surface nornal)&br&&br&如果需要,可以用poisson surface reconstruction将dense point cloud转化为polygon&br&&br&------&br&&b&SIFT (Scale Invariant Feature Transform)&/b&&br&同样的特征点在不同的scale,方向,光照下都能被检测到,并且理论上会有相同的描述向量. (即invariant)&br&SIFT有很多变种,但实际上很类似,一般是添加几种可以保持invariant的变换, 比如仿射变换.&br&&br&一个SIFT特征有四个部分(位置position, 大小scale, 方向direction, 描述向量descriptor).&br&比较两点可以直接比较其特征向量,不用考虑别的参数.&br&&br&特征点的position和scale是在DoG Pyramid中找到的extrema.&br&方向是在特征scale下周边梯度histagram的主导方向.&br&描述向量是特征scale下以特征方向为准的坐标系下的梯度histagram&br&&br&&figure&&img src=&/651e336ac54a6803dbb03adb87f2a4e3_b.jpg& data-rawwidth=&800& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/651e336ac54a6803dbb03adb87f2a4e3_r.jpg&&&/figure&&br&&br&lowe's sift: &a href=&///?target=https%3A///ptx-pluto/web-sfm/tree/master/src/websift& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.cs.ubc.ca/~lowe/keypoints/&i class=&icon-external&&&/i&&/a&&br&SiftGPU: &a href=&///?target=http%3A//cs.unc.edu/%7Eccwu/siftgpu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SIFT on GPU (siftgpu)&i class=&icon-external&&&/i&&/a&&br&我的JS实现: &a href=&///?target=https%3A///ptx-pluto/web-sfm/tree/master/src/websift& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web-sfm/src/websift at master · ptx-pluto/web-sfm · GitHub&i class=&icon-external&&&/i&&/a&&br&&br&-----&br&&b&ANN Feature Matching (近似最邻近特征匹配)&/b&&br&找出两张图片之间特征向量的Nearest Neighbor,从而找出点与点之间的匹配关系。&br&这里输出的匹配是嘈杂的,存在错误,
且非常耗时.&br&&br&先对两组特征(vs1[], vs2[])分别建立kd-tree&br&特征有128维,传统的kd-tree效果很差,需要对其进行平衡。在构建kd-tree选择hyperplane的时候,取方差最大的维度,在中位数处split.&br&为了加快速度,并不寻找严格NN, 而是在kd-tree上寻找ANN(Approximate NN).&br&匹配是否被采纳并不是使用传统的阀值,而是用一个优先序列来找ANN,最后通过第一与第二的距离比来确定是否采纳。同时v1,v2必须同时互为ANN,匹配(v1,v2)才被采纳.&br&&br&ann: &a href=&///?target=https%3A//www.cs.umd.edu/%7Emount/ANN/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ANN - Approximate Nearest Neighbor Library&i class=&icon-external&&&/i&&/a&&br&我的JS实现: &a href=&///?target=https%3A///ptx-pluto/web-sfm/tree/master/src/webmatcher& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web-sfm/src/webmatcher at master · ptx-pluto/web-sfm · GitHub&i class=&icon-external&&&/i&&/a&&br&&br&-----&br&&b&RANSAC:&/b&&br&用RANSAC和八点算法可以将嘈杂的匹配的结果稳定化.&br&&br&适用情形: dataset存在少量错误,但服从一个constrain,并且constrain可以用dataset的一个很小的子集倒推回去。(在几何中这样的例子很多,比如给你某个平面上1000个点的坐标,但其中有错误数据,其constrain就是这个平面,而平面用3个点就可以确定)&br&&br&原理: 随机抓一个subset并估算constrain,若subset中有错误数据,该constrain会很不准确,reject大部分数据;相反若subset中恰好都是正确数据,则会得到正确的constrain,accept大部分数据。因此不停的执行这个过程,直到找到正确的constrain,然后判定被其reject的数据为错误数据。(或因尝试次数过多退出)&br&&br&在这里,dataset就是特征匹配输出的对应关系,而constrain就是核线几何(f-matrix), 用8个对应关系即可用八点算法估算出f-matrix. RANSAC可以筛除不符合核线几何的错误匹配.&br&&br&&figure&&img src=&/91d1c1a1aa196e6d99fe_b.jpg& data-rawwidth=&1000& data-rawheight=&665& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/91d1c1a1aa196e6d99fe_r.jpg&&&/figure&&br&&br&RANSAC非常简单,代码只有十几行,而且效果非常明显,肉眼可辨&br&我的JS实现: &a href=&///?target=https%3A///ptx-pluto/web-sfm/blob/master/src/math/ransac.js& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web-sfm/ransac.js at master · ptx-pluto/web-sfm · GitHub&i class=&icon-external&&&/i&&/a&&br&&br&------&br&&b&Eight Point Algorithm (八点算法)&/b&&br&用八个点点对应关系计算核线几何(f-matrix)&br&&br&两个Projective Camera之间的点点对应关系是需要满足核线几何的,就像三点可以确定一个平面一样,8对匹配可以确定两个相机的核线几何.&br&核线几何简单的讲就是 &b&x1*F*x2=0 &/b&, F是fundamental matrix (3x3, rank 2), x1,x2是相对应的两点的homogenous坐标。&br&将x1,x2代入后可以得到关于(f1,....f9)的一个线性方程,8对就是8个方程,再用SVD即可得最小二乘解.&br&&br&------&br&&b&Bundler Camera Registrtion&/b&&br&用tracks来估算相机参数.&br&&br&bundler是incremental的,并且依赖于sparse bundle adjustment。初始化第一对相机后,便不断的用已知点估算新相机,并triangulate新的点,直到没有candidate为止,中间不断的做SBA来拟合新的参数, 并且每一轮做一次全局SBA。&br&&br&bundler: &a href=&///?target=http%3A//www.cs.cornell.edu/%7Esnavely/bundler/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bundler - Structure from Motion (SfM) for Unordered Image Collections&i class=&icon-external&&&/i&&/a&&br&我的JS实现: &a href=&///?target=https%3A///ptx-pluto/web-sfm/blob/master/src/webregister/register.js& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web-sfm/register.js at master · ptx-pluto/web-sfm · GitHub&i class=&icon-external&&&/i&&/a&&br&&br&------&br&&b&SBA (Sparse Bundle Adjustemt)&/b&&br&SBA就是一个为view geometry优化之后的levenberg-marquardt非线性拟合算法. 在最小化projection error的时候,jacobian和hessian矩阵是稀疏的,而且存在特殊规律。利用了稀疏结构之后,就算有几千个变量需要拟合,速度也非常快。下图为sparse jacobian和sparse hessian.&br&&br&&figure&&img src=&/f99fbaf5ba3cc7_b.jpg& data-rawwidth=&253& data-rawheight=&377& class=&content_image& width=&253&&&/figure&&figure&&img src=&/04bcca873cca3f88ea99da_b.jpg& data-rawwidth=&377& data-rawheight=&377& class=&content_image& width=&377&&&/figure&&br&&br&sba: &a href=&///?target=http%3A//users.ics.forth.gr/%7Elourakis/sba/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sparse Bundle Adjustment in C/C++&i class=&icon-external&&&/i&&/a&&br&我的JS实现: &a href=&///?target=https%3A///ptx-pluto/web-sfm/blob/master/src/webregister/sparse-bundle-adjustment.js& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web-sfm/sparse-bundle-adjustment.js at master · ptx-pluto/web-sfm · GitHub&i class=&icon-external&&&/i&&/a&&br&&br&-------&br&&b&CMVS/PMVS (Dense Reconstruction)&/b&&br&使用surfel model的dense reconstruction, 比较复杂, 自己看吧&br&CMVS/PMVS: &a href=&///?target=http%3A//www.di.ens.fr/cmvs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CMVS&i class=&icon-external&&&/i&&/a&
简历发这pu. ================================================== 我讲一下用一组图片来做3D reconstruction需要的算法吧(SFM), 使用这种方法的软件比较代表性的有 Pix4Dmapper, Autodesk 123D Catch, PhotoModeler, VisualSFM 我用JavaScript撸…
已有帐号?
无法登录?
社交帐号登录
354 人关注
455 条内容
777 条内容
7703 人关注
259 条内容
1676 人关注
305 条内容
410 人关注
867 条内容

我要回帖

更多关于 ct重建算法 的文章

 

随机推荐