打开之前vs2010的工程,点击build,结果遇到了在targetver.h文件中找不到SDKDDKVer.h的问题,原因就在于之前工程的configuration properties->VC++ Directories->Include Directories中改成了
$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(ProjectDir);
添加了$(ProjectDir),结果就因为这一改,这一栏属性没有更新至vs2015的默认设置,提供了错误的include路径,自然就找不到SDKDDKVer.h文件了,因此我在vs2015中新建了一个工程,看了下默认的路径设置,其实只要选择<inherit from parent or project defaults>就可以恢复到正确路径了:
$(VC_IncludePath);$(WindowsSDK_IncludePath);
problem solved
2016年3月13日星期日
Establish git source control for Visual Studio 2015 project
之前的工程目录本来就是一个repository,里面有个.git的隐藏文件夹,其中记录了版本控制的信息,因此用vs2015打开工程以后直接在各个文件前面就会显示红勾,表示处于checked状态,但是还不能进行commit等操作,因为我在安装vs2015的时候并没有安装git source control,因此还需要安装git。于IDE右侧Team Explorer中直接会出现install git的按钮,点击后会跳转至git的网站,下载相应版本并完成安装,之后就可以在vs2015 IDE中直接享受git source control了。
2016年3月12日星期六
Compile opencv 3.1 from sources on windows 10 (64-bit)
1、下载opencv 3.1,并解压至F盘,这时F盘中会有一个opencv的文件夹;
2、下载最新的CMake(我当前使用的是CMake 3.4.3)并安装;
3、下载最新的stable release Eigen库(我当前使用的是Eigen 3.2.8),并解压,于F:\opencv文件夹中新建一个dep文件夹,并把解压得到的eigen-eigen-07105f7124f9文件夹拷贝至dep文件夹;
4、下载最新的stable release TBB库(我当前使用的是TBB 4.4 update 3),并同样解压至dep文件夹中,这里要注意不要下载source代码,而是下载windows* OS库,因为里面有预先编译好的tbb_debug.lib和tbb.lib,而这两个.lib文件是后续编译opencv时需要用到的;
5、于opencv文件夹中新建一个mybuild文件夹,然后打开CMake程序,并选择
source code路径为:F:/opencv/sources
build binaries路径为:F:/opencv/mybuild
之后勾选Grouped复选框,接着点击Configure按钮,在弹出的对话框中选择编译器为Visual Studio 14 2015,即32位版本;
6、在默认的CMake设置基础上,我做了如下改动:
2、下载最新的CMake(我当前使用的是CMake 3.4.3)并安装;
3、下载最新的stable release Eigen库(我当前使用的是Eigen 3.2.8),并解压,于F:\opencv文件夹中新建一个dep文件夹,并把解压得到的eigen-eigen-07105f7124f9文件夹拷贝至dep文件夹;
4、下载最新的stable release TBB库(我当前使用的是TBB 4.4 update 3),并同样解压至dep文件夹中,这里要注意不要下载source代码,而是下载windows* OS库,因为里面有预先编译好的tbb_debug.lib和tbb.lib,而这两个.lib文件是后续编译opencv时需要用到的;
5、于opencv文件夹中新建一个mybuild文件夹,然后打开CMake程序,并选择
source code路径为:F:/opencv/sources
build binaries路径为:F:/opencv/mybuild
之后勾选Grouped复选框,接着点击Configure按钮,在弹出的对话框中选择编译器为Visual Studio 14 2015,即32位版本;
6、在默认的CMake设置基础上,我做了如下改动:
- 在WITH group中uncheck WITH_CUDA;check WITH_OPENGL, WITH_TBB;
- 在BUILD group中check BUILD_EXAMPLES,BUILD_opencv_world;
- 在Ungrouped Entries中为EIGEN_INCLUDE_PATH设置为F:/opencv/dep/eigen-eigen-07105f7124f9;为TBB_INCLUDE_DIRS设置为F:/opencv/dep/tbb44_20160128oss/include
7、再次点击Configure按钮后,需要为TBB_LIB_DIR指定路径,设置其为F:/opencv/dep/tbb44_20160128oss/lib/ia32/vc14,首先由于前面选择的编译器为win32,因此这里选择ia32文件夹而非intel64,另外,这个路径一定要进一步选择至vc14,这一点至关重要,因为要是只设置到ia32文件夹的话,后续在编译opencv库的时候,会出现LNK1104 cannot open file 'tbb_debug.lib'错误,这是因为此时CMake generate的.sln中有多个工程依赖于外部文件_tbb_windef.h,里面有语句#pragma comment(lib, "tbb_debug.lib"),即链接时需要用到tbb_debug.lib,而如果没有提供到vc14文件夹的路径,那么这些工程的Linker->General->Additional Library Directories中就不会给出正确的包含tbb_debug.lib的文件路径。当然如果由于疏忽,在CMake时没有设置对路径也没有太大关系,因为可以手动为每个相关的工程在Linker->General->Additional Library Directories中重新把路径设置到vc14文件夹,只不过麻烦点,需要每个工程都更改一遍,如果CMake时就设置对路径就省去了这些麻烦。完事之后再次点击Configure应该就没问题了,接着再点击Generate生成OpenCV.sln;
8、双击打开OpenCV.sln,置于debug和win32,然后在菜单栏点击Build ALL_BUILD工程(记住不是Build Solution),或者右键ALL_BUILD工程选择Build;完事之后右键INSTALL工程选择Build;之后切换至release模式重复上述两次Build,最终编译得到的所有.dll和.lib文件以及.h头文件就位于F:\opencv\mybuild\install文件夹中。
The end.
2016年3月7日星期一
关于加班
晚十二点开完会回到宿舍,心里不禁想,LD真的非得把会安排在晚上开吗?就不能安排在白天工作时间?LD白天有那么忙?会后简单的一句“不好意思,占用大家休息时间了”就算抚慰人心了。
国外的经历让我也逐渐开始赞同一种看法:只有那些不会管理时间,工作效率低下的人才需要靠加班来完成工作,我也逐渐开始学习如何管理自己的工作时间,如何抓重点,如何按照优先级来完成手头的工作,以提高工作效率,这样自己在工作之余可以有时间放松,或者是享受兴趣爱好,亦或是读书学习。但是这一套思路想要得到落实得有个前提条件,那就是时间得是由自己安排,那么问题来了,当LD的时间安排驾临于一切之上的时候,这一套思路就然并卵了。
莫非这次又是我自己理想主义了?我想知道国外的那种工作时间制度是怎么贯彻执行的,文化认知?法律保障?个人抗争?
2015年9月25日星期五
Link to my recently published ISPRS journal paper: Accurate and Occlusion-Robust Multi-View Stereo
Title: Accurate and Occlusion-Robust Multi-View Stereo.
Journal: ISPRS Journal of Photogrammetry and Remote Sensing.
DOI: 10.1016/j.isprsjprs.2015.08.008.
Authors: Zhaokun Zhu (warrior.zzk@gmail.com),
Christos Stamatopoulos (xstamatopoulos@gmail.com),
Clive S. Fraser (c.fraser@unimelb.edu.au).
Abstract:
This paper proposes an accurate multi-view stereo method for image-based 3D reconstruction that features robustness in the presence of occlusions. The new method offers improvements in dealing with two fundamental image matching problems. The first concerns the selection of the support window model, while the second centers upon accurate visibility estimation for each pixel. The support window model is based on an approximate 3D support plane described by a depth and two per-pixel depth offsets. For the visibility estimation, the multi-view constraint is initially relaxed by generating separate support plane maps for each support image using a modified PatchMatch algorithm. Then the most likely visible support image, which represents the minimum visibility of each pixel, is extracted via a discrete Markov Random Field model and it is further augmented by parameter clustering. Once the visibility is estimated, multi-view optimization taking into account all redundant observations is conducted to achieve optimal accuracy in the 3D surface generation for both depth and surface normal estimates. Finally, multi-view consistency is utilized to eliminate any remaining observational outliers. The proposed method is experimentally evaluated using well-known Middlebury datasets, and results obtained demonstrate that it is amongst the most accurate of the methods thus far reported via the Middlebury MVS website. Moreover, the new method exhibits a high completeness rate.
Link to this paper:
It's available for free until November 7, 2015.
Welcome to download.
2014年12月15日星期一
毕业前文献阅读总汇,一季度
1. Fast Cost-Volume Filtering for Visual Correspondence and Beyond (Completed read on 16th Dec. 2014).
Asmaa Hosni和Michael Bleyer 2013年在TPAMI上发表的一篇Short paper,现在的引用已经有四十几次了。本文提出的Fast Cost-Volume Filtering方法是一种可以用于stereo、optical flow以及分割的一类通用方法,如果用于stereo,那么就成了一种local binocular stereo方法,具体做法就是首先构建匹配代价空间,也就是Disparity Space Image (DSI),然后对DSI中的每个视差层的每个像素进行加权滤波,最后在滤波后的DSI中采用Winner-Takes-All策略为每个像素选定最优视差值。
Yoon and Kweon提出的Adaptive Support-Weight (ASW)方法说白了其实也就是这么一种在Cost-Volume进行滤波然后WTA选择视差的流程,只不过Yoon and Kweon没有从Cost-Volume Filtering的角度来阐述他们的方法,而是从support weight的角度来阐述的,且ASW用的是Bilateral filtering,这篇文章里采用的是guided filtering算法,即用参考图为guidance image来计算权值,说是可以用integral image方法来快速实现,从而使其运算量与窗口大小无关。
本文的方法已经可以以很高的帧率来进行实时视差图估计了,精度也不错,值得深入学习,现在里面采用的guided filtering的原理还需要进一步学习一下,只知道它的加权方式和bilateral filtering的方式不太一样,bilateral里的权值跟像素间的距离以及色彩差有关,而这里的guided filtering就涉及到窗口的色彩均值以及协方差阵,接下来就看介绍guided filtering的原文献。
2. Automated Target-Free Network Orienation and Camera Calibration (Completed read on 21th Dec. 2014).
这就是Christos和Clive今年六月份在意大利参加ISPRS会议的时候发表的文章,内容就是关于iWitness在不使用人工标志的情况下如何利用自然图像特征来进行自动化的相机网络定向。
文章算法的流程分为5大步:
一、先提取每幅图像上的特征点,并且通过FLANN (Fast library for approximate nearest neighbors)最近邻算法来获得图像对之间的初始的特征点匹配,FLANN算法是Muja和Lowe提出的,里面有针对vector-based features (SIFT, SURF)的最近邻匹配搜索算法,也有针对binary-valued features (BRIFF, ORB and FREAK)的最近邻匹配搜索算法;
二、图像对之间特征点对应的refinement,这一步又分为4小步,首先就是要求一个特征点的最优匹配的匹配距离最多只有次优匹配的匹配距离的30%,否则这种点对应就被取消掉了;上一步之后,还是会存在一对多的匹配情况,因此第二步就是强行只保留那些一对一的点匹配,滤除掉任何一对多的点匹配;第三步是构建一个二维的统计直方图,一维是特征描述的半径,一维是特征描述的旋转,构建好直方图之后,滤除掉那些和大多数匹配特征描述不一致的点匹配;最后一步就是基于基础矩阵的RANSAC方法了,文章用的是Nister (2004)的5点算法,文章说这里的RANSAC可以应对最多50% outliers的情况,前面几步的filtering就是为了减少这里RANSAC时的outliers;
三、识别添加更多的点匹配,上一步中的第一步过滤利用到了最优匹配和次优匹配的匹配距离,滤除了很多有可能正确的匹配,这里利用已经RANSAC估计得到的基础矩阵来检验这些匹配中哪些是可以恢复为正确的,这里同时检验最优匹配和次优匹配,只有当最优匹配和次优匹配中的其中之一满足对极几何时才会被恢复采纳,否则还是会被弃用,因为如果最优匹配和次优匹配都满足对极几何将无法得知哪个才是真正的匹配。这一步骤能够恢复很多点匹配;
四、Epipolar Mismatch Filtering,这一步具体还是参见原文的描述,我没有看太明白,我的理解是多个匹配在两幅图像上的拓扑关系应该是可以用一个所谓的projective transformation描述的,从左图到右图用一个这样的转换关系描述一次,不满足该描述的点被标记了,然后从右图到左图再描述一次,要是已经被标记的点依然不满足该描述那么该匹配就被剔除掉了,目前的理解就是这样,详细的过程可以请教Christos;
五、Network orientation,文章算法里的Relative orientation并不是仅仅选择在拥有最多点匹配的图像对之间去做,而是选择的在拥有最多multi-ray点匹配的图像对之间去做,这样将使得在需要进行前方交会之前有最多可能的图像通过后方交会的方式定向好。
3. Fully Automated Image Orientation in The Absence of Targets (Completed read on 23th Dec. 2014).
这就是Christos和Clive 2012年墨尔本八月底ISPRS大会上投的稿,上一篇文献是对本文的一个补充和总结。因此方法论这一块应该是上一篇文章里描述的更为准确详细,这里就摘录一些本文的文字叙述吧,前言部分提到有其它文章已经阐述了基于自然图像特征的匹配精度能达到0.3个像素的样子,也有人尝试过在特征匹配的基础上进一步跟进一次最小二乘匹配,精度大概能提高到0.25个像素的样子,提升不明显,因此本文作出了图像特征匹配精度很难再进一步提升的论断。文章阐述了在对wide baseline图像进行匹配的时候,为了保证能有足够多的特征点参与匹配,在特征检测的过程中最好不要强加很强的响应阈值,或者说直接不加任何响应阈值,以获得足够多的特征点,否则在大基线的情况下因为基线或者会聚角一大特征点的相似性就下降了本来能配上的点就少,要是一开始检测到的能够来参与匹配的特征就少那更加影响匹配的成功率。
这篇文章对上文中利用projective tranformation剔除匹配outliers进行了详细的描述,我的理解是该算法先对左图中提取出来的一系列图像特征点进行二维的迪罗尼三角网格化,然后利用得到的一个个三角形的三个点去和对应的右图上的匹配的三个点估计一个之间的仿射变换参数,并对各估计的仿射参数在参数空间内进行聚类,拥有较少元素的聚类被认为是一些孤立的参数集,它们联系的图像点的匹配就被当作outliers剔除掉,这是利用三角网格估计仿射变换参数的方式,文中还描述了利用四边形网格估计射影变换参数的方式,并通过实验说明射影变换的方式更优于仿射变换的方式,因为仿射变换仅仅适合于小图像区域的情形,不能描述大图像区域的情形,利用文中构建四边形网格的方式是在上述三角形网格的基础上拆掉相邻三角形的共有边来构建的四边形网格。
4. A Public System for Image Based 3D Model Generation (Completed read on 26th Dec. 2014).
这篇文章是ARC3D http://www.arc3d.be/ 提供的两篇参考文献之一,作者为David Tingdahl和Luc Van Gool (SURF的作者之一),发表于2011年。
在文章的previous work中提到ARC3D在2005年就已经上线运行,至今已经有9个年头了,堪称所有在线三维重建服务的鼻祖。同样的服务还有微软的PhotoSynth以及最近的3dTubeMe。
ARC3D的重建流程为:
一、首先对用户上传的图像内参数进行预标定,一般头像的EXIF数据中会包含有物理焦距信息,但是不一定包含像元尺寸信息,这时系统就在互联网上自动的搜索像机的像元尺寸参数,有了这两个信息之后就可以得到大致的等效焦距信息;
二、在每一幅图像上提取SURF特征点,并且为每个图像对进行特征点匹配,对于两幅图像都预先有内参数初值的,采用5点算法RANSAC计算本质矩阵来匹配,否则就采用7点算法RANSAC计算基础矩阵。
三、自标定,这是可选步骤,如果所有输入图像中少于两幅图像预先知道内参数,那么就采用Web-based 3D reconstruction service (ARC3D提供的另外一篇参考文献)一文中描述的自标定算法来标定内参数,但是这种方法在图像内参数不恒定,以及像机运动(turntable motion)和场景结构不够general (为平面)时会失效;
四、稀疏重建,为了保证足够的基线,通过检查两幅图像之间的关系是否可以很好的用一个无穷单应(infinite homography)来描述来判断两幅图像是否有足够长的基线,如果可以就说明两图像的基线太短,这一方法在3D Reconstruction from Multiple Images: Part 1 - Principles一文中有详细描述,每个新加入的图像通过3个已有的重建点进行后方交会来确定外定向,并且跟进光束法平差优化,平差的参数有6个外定向参数、一个等效焦距值以及2个径向畸变系数;
五、密集重建,稀疏重建结果被用来初始化密集重建,利用已得到的图像定向关系,将所有重叠的图像串成链条,然后进行极线矫正,并采用基于动态规划的dense stereo算法来估计视差图(Visual Modeling with a Hand-Held Camera)。Stereo pairs被串成链,并且每个像素的最优深度通过Kalman滤波跟踪出来。密集重建方法同时还提供质量图,每个像素估计的质量通过正确匹配上的图像个数来表征。
文章中提出了一种view selection策略来从所有的深度图中只选择若干幅来进行后续的meshing,这样做的理由的是很多的图像之间有大量的重叠区域会导致meshing过程中大量不必要的计算量,再者就是低质量的深度图也参与meshing的话会导致meshing的质量下降。很显然这里的view selection和之前我了解的那个view selection指的不是一个意思,一般view selection是指的在密集重建时基于某种准则为参考图像选择若干合适的匹配图像。这里为meshing的view selection的准则是尽可能减少overlap的同时要尽可能多的cover整个重建场景,还有就是倾向于选择高质量的深度值参与meshing。文章里判断coverage时不是用的密集点,而是用的稀疏重建点去判断的。
在真正做meshing之前,先对所有的深度图进行剔除outliers的操作,有3步骤,首先删除那些少于三幅图像观测到的深度图的像素,接着按深度聚类,只保留最大连通的深度区域,其它的像素全部删除,最后做一个腐蚀操作,剔除掉深度边界可能的噪声深度点。之后文章还有一步所谓的Depth map to 3D,将深度图反投影至空间中,并通过连接邻近点得到一个粗糙的mesh,剔除那些法向和光轴夹角太大的triangles,以及那些最短边比最长边短两倍以上的triangles。上两步之后,就是用的Poisson表面重建方法来做真正的meshing,格网之后,剔除那些拥有边长比所有网格边平均长度还长5倍的triangles。
形成mesh之后,要为mesh应用纹理,也就是为mesh里的每个faces着色,我看他们的做法是为face在每个图像里做frustum culling(遮挡判断),看face在哪些图像里可见,然后选择可见图像中投影面积最大的那幅图像里的颜色信息来为该face着色。
5. Web-Based 3D Reconstruction Service (Completed read on 28th Dec. 2014).
这篇文章就是ARC3D http://www.arc3d.be/ 提供的另一篇参考文献,作者为Maarten Vergauwen和Luc Van Gool,发表于2006年。
文章里更为详细的描述了他们的系统里是如何为每幅图像计算密集深度图的,算法主要流程分为4大步骤:
一、判断哪些图像对可以用来进行匹配,包括降采样以及Global Image Comparison两步,这个全局图像比较其实就是判断个两图间的相似性;
二、先为上一步中得到的所有图像对进行特征匹配,然后选择若干组三视图组进行射影重建,并基于此进行像机自标定,得到图像的内参数;
三、欧氏重建以及将深度图upscale至原分辨率;
四、密集重建。
文章的算法一开始就对所有的输入图像降采样至最大1000×1000的图像,然后后续操作在upscale之前全都是在这些小分辨率的图像上去做。
这篇文章涉及的内容还比较多,详细的阐述这里就不复述了,还是参见原文,他里面的Global Image Comparison方法还有点意思,是将所有图像进一步降采样至最大只有100×100,然后直接通过平移窗口在两视图间去算NCC去判断的相似性的,有点意思。
6. Where is photogrammetry heading to? State of the art and trends (Completed read on 16th Feb. 2015).
这是2015年最新出来的一篇综述性的文章,文章里就Image orientation, surface reconstruction and object restitution三个基本方面对Photogrammetry和Computer vision进行了对比。
文章里出现了Automatic block orientation这个术语,block orientation具体指的什么意思我没有看太明白。文章里还较为详细的描述了在三视图参与匹配时如何剔除误匹配,其中提到了一种data snooping的local bundle solution方法,这个方法是我接下来要去学习的内容。
之后文章中又出现一个Bundle block adjustment的术语,这个block在这里指的什么,这个光束法平差和我知道的光束法平差的差异在哪里我也不太清楚。文章提到CV领域在做光束法平差时往往采用LM算法,而摄影测量领域往往采用Gauss-Newton方法,另外CV领域做BA一般不用Ground control points,而摄影测量领域则有GCPs,文章说BA里不用GCPs的话会产生block deformations,且image orientation的好坏不能仅从重投影残差来看,还得使用check points,这些个情况也是我需要进一步了解的,我一直认为BA过程中不需要控制点,只需要固定某一个图像的坐标系即可,其它的全部可以自由平差。
7. Orientation and 3D Modelling from Markerless Terrestrial Images: Combining Accuracy with Automation (Completed read on 20th Feb. 2015).
这篇文章以及接下来的两篇文章都是上一篇文献中介绍data snooping时列出来的参考文献。该文是Luigi Barazzetti于2010年在The Photogrammetric Record上发表的一篇期刊文章。
文章提出的方法主要是针对利用calibrated cameras拍摄的图像来进行三维重建,并且提到在weak image network的时候最好避免self-calibration(自检校),可以想象在image network不好的时候进行自检校光束法平差出来的重建结果不可靠,因为自检校光束法平差时内外参耦合严重,外参数的一部分误差可能会融入到内参数误差里,即使最终残差会少不少。
文章方法的第一步也是检测SIFT或者SURF特征点,然后通过描述子来进行特征匹配,第三步就是利用基于epipolar geometry的robust techniques来大量剔除匹配outliers,当图像内定向未知时该对极几何用基础矩阵F表示,内定向已知时则可以考虑用本质矩阵E表示,并通过Nister(2004)提出的5点算法来求解,文中介绍了3种robust techniques: RANSAC, LMedS (least median of squares) and MAPSAC (maximum a posterior sample consensus),并介绍了3种方法各自的优缺点,并指出MAPSAC的使用能带来significant solution improvement。
接下来文中方法采用最小二乘匹配(LSM)来进一步提高各匹配同名像点的定位匹配精度,虽然文中没有明确说明,但是既然要使用LSM,那么肯定是以某一个图像里同名像点为中心抠出来了一块参考窗口,并在其它各匹配图像中去做LSM的。
文中还引用了Clive 96年的一篇文章里的一个根据像点提取精度来推算重建空间点精度的经验公式,并以此出发提到图像特征被越多的图像观测到会带来越高的稀疏重建精度以及图像定向精度。因此在上述步骤之后,文中方法进一步在每一幅图像上提取FAST角点特征,因为FAST相对于SIFT和SURF有着更高的repeatability and better distribution in the images。提取的FAST特征点是通过基于collinearity geometry的multi-image constrained LSM来进行匹配的,这一步骤我没有太明白到底是怎么做的,文中指出points are projected onto the images,难道是先交会出来?但是交会的时候怎么识别误匹配呢?文中没有说对FAST特征点也去生成特征描述并进行特征描述匹配,我自己想了下一个可行做法就是每个图像里的每个FAST特征点都在其它图像中去做LSM,但这样做似乎又不是文中所说的multi-image constrained LSM,所以这一块具体是怎么做的我还没有理解太透彻。
完成所有图像的定向之后就是进行文中所谓的surface measurements,也就是相当于密集表面重建吧,但是经过我的反复阅读,我认为文中方法并不是企图为每幅图像的每个像素都估计一个深度和法向,按我阅读后的理解,他应该是这么去做的,首先也是建立了金字塔,即为每幅图像生成了不同分辨率的金字塔图像,在每一层都进行了以下步骤:在图像上划分均匀的image grid,每个格子里都提取了 Lue interest points,每个interest points的初始深度和法向估计通过多个邻近的在之前网络定向环节得到的稀疏点来插值得到,然后以该interest point为中心,抠一块矩形区域来按当前法向沿深度方向上去移动,并与其它多个匹配图中重采样出来的窗口去计算NCC值,并取所有NCC值之和(SNCC)最大的深度为该interest point处当前最优的表面深度估计,这整个过程被称为 geometrically constrained cross-correlation (GC3),调整的应该只有深度,而没有法向,但不知道作者是怎么去调整深度的,是等间隔采样还是怎么着?也不清楚window warping是基于什么模型去做的,即一个窗口里对应的空间surface是通过几个什么参数来描述的,这些文中都没有说清楚。
然后文中说利用MPGC LSM在原图分辨率上来进一步提高匹配精度,这里用的MPGC LSM是Gruen原始的方法,不知道该原始MPGC里面调整的参数有哪些,我觉得至少应该有沿点心射线上的深度值,然后作为一种表面估计方法,它里面是如何描述和调整表面法向的我还不太清楚,但我看到有一句话就是while the affine parameters converge during the iterations,难道参考窗口和每个匹配窗口之间的形变还是通过仿射模型来描述的?那每个不同匹配窗口岂不是都拥有自己不同的仿射参数?那优化的参数可就多了去了,anyway,我还是阅读完Gruen的原文后才能有发言权。
看完该文的密集表面重建方法,我感觉跟我自己的方法有相似的地方,但也还是有很多不同的地方。
8. Experiences and Achievements in Automated Image Sequence Orientation for Close-Range Photogrammetric Projects (Completed read on 22th Feb. 2015).
该文是Luigi Barazzetti于2011年发表的一篇SPIE的会议文章。相比上一篇期刊文章,这篇文章内容要精简很多,但也有些值得学习的点。
例如在提取图像特征(SIFT或者SURF)并完成匹配后,肯定会出现图像某些纹理丰富的区域提取出非常密的特征点,有些纹理弱一点的区域就只有非常稀疏的特征点,也就是说图像特征分布不是很均匀,那么文中方法就这么处理:先在图像划分均匀网格,每个网格里只保留multiplicity最高的特征点,也就是在最多图像上成功匹配的特征点,这样做的话就不会出现物方某一小块区域重建出大量的密集点,而有些区域只重建出少量点,就相当于光束法平差的时候某一块区域的物点的权重较大,而另一些区域的权重较小了,这也算是一种weak geometry吧。
文中还指出虽然在匹配环节通过基于对极几何的robust techniques能剔除掉大量的匹配outliers,但也没法完全确保光束法平差的时候百分之百的没有outliers,因此在多图光束法平差的时候还是有必要利用data snooping来在平差迭代过程中进一步剔除outliers。文中在实验结果中还列了一个重建结果,利用本文的方法由于在bundle迭代过程中剔除了几个wrong data使得最终成功的完成了所有图像的定向和稀疏重建。但是利用Autodesk Photofly以及Microsoft Photosynth处理同一组图像则都失败了,文中总结其原因就是most probably due to the repeated patterns in the scene and the employed bundle adjustment.
在讨论部分文章指出stability of the solution依赖于两类点:
1. tie points (TPs), which guarantee the precision of the orientation solution; they should be numerous, well distributed on the object and in the image space and they should feature a high multiplicity;
2. ground control points (GCPs), which have the role to fix the datum and to control the block deformation.
最后还指出SfM的精度依赖于tie points的measurement precision, multiplicity and spatial distribution.
9. Comparison of Two Structure and Motion Strategies (Completed read on 23th Feb. 2015).
该文是R. Roncella于2011年在International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences上发表的一篇文章。
题目中的两种SaM策略其实就是作者自己的一个软件中先后采用的两种策略,最新的策略和老策略的区别就在于新策略采用了SIFT和SURF这种图像特征以及匹配方式;第二个区别就在于利用基于epipolar/trifocal几何约束的robust techniques剔除outliers时,新策略充分利用了已知内定向的约束,比方说就是把之前鲁棒估计F换成了鲁棒估计E来剔除outliers,就这么简单,详细的过程可以参考原文,这里不再赘述了。
Asmaa Hosni和Michael Bleyer 2013年在TPAMI上发表的一篇Short paper,现在的引用已经有四十几次了。本文提出的Fast Cost-Volume Filtering方法是一种可以用于stereo、optical flow以及分割的一类通用方法,如果用于stereo,那么就成了一种local binocular stereo方法,具体做法就是首先构建匹配代价空间,也就是Disparity Space Image (DSI),然后对DSI中的每个视差层的每个像素进行加权滤波,最后在滤波后的DSI中采用Winner-Takes-All策略为每个像素选定最优视差值。
Yoon and Kweon提出的Adaptive Support-Weight (ASW)方法说白了其实也就是这么一种在Cost-Volume进行滤波然后WTA选择视差的流程,只不过Yoon and Kweon没有从Cost-Volume Filtering的角度来阐述他们的方法,而是从support weight的角度来阐述的,且ASW用的是Bilateral filtering,这篇文章里采用的是guided filtering算法,即用参考图为guidance image来计算权值,说是可以用integral image方法来快速实现,从而使其运算量与窗口大小无关。
本文的方法已经可以以很高的帧率来进行实时视差图估计了,精度也不错,值得深入学习,现在里面采用的guided filtering的原理还需要进一步学习一下,只知道它的加权方式和bilateral filtering的方式不太一样,bilateral里的权值跟像素间的距离以及色彩差有关,而这里的guided filtering就涉及到窗口的色彩均值以及协方差阵,接下来就看介绍guided filtering的原文献。
2. Automated Target-Free Network Orienation and Camera Calibration (Completed read on 21th Dec. 2014).
这就是Christos和Clive今年六月份在意大利参加ISPRS会议的时候发表的文章,内容就是关于iWitness在不使用人工标志的情况下如何利用自然图像特征来进行自动化的相机网络定向。
文章算法的流程分为5大步:
一、先提取每幅图像上的特征点,并且通过FLANN (Fast library for approximate nearest neighbors)最近邻算法来获得图像对之间的初始的特征点匹配,FLANN算法是Muja和Lowe提出的,里面有针对vector-based features (SIFT, SURF)的最近邻匹配搜索算法,也有针对binary-valued features (BRIFF, ORB and FREAK)的最近邻匹配搜索算法;
二、图像对之间特征点对应的refinement,这一步又分为4小步,首先就是要求一个特征点的最优匹配的匹配距离最多只有次优匹配的匹配距离的30%,否则这种点对应就被取消掉了;上一步之后,还是会存在一对多的匹配情况,因此第二步就是强行只保留那些一对一的点匹配,滤除掉任何一对多的点匹配;第三步是构建一个二维的统计直方图,一维是特征描述的半径,一维是特征描述的旋转,构建好直方图之后,滤除掉那些和大多数匹配特征描述不一致的点匹配;最后一步就是基于基础矩阵的RANSAC方法了,文章用的是Nister (2004)的5点算法,文章说这里的RANSAC可以应对最多50% outliers的情况,前面几步的filtering就是为了减少这里RANSAC时的outliers;
三、识别添加更多的点匹配,上一步中的第一步过滤利用到了最优匹配和次优匹配的匹配距离,滤除了很多有可能正确的匹配,这里利用已经RANSAC估计得到的基础矩阵来检验这些匹配中哪些是可以恢复为正确的,这里同时检验最优匹配和次优匹配,只有当最优匹配和次优匹配中的其中之一满足对极几何时才会被恢复采纳,否则还是会被弃用,因为如果最优匹配和次优匹配都满足对极几何将无法得知哪个才是真正的匹配。这一步骤能够恢复很多点匹配;
四、Epipolar Mismatch Filtering,这一步具体还是参见原文的描述,我没有看太明白,我的理解是多个匹配在两幅图像上的拓扑关系应该是可以用一个所谓的projective transformation描述的,从左图到右图用一个这样的转换关系描述一次,不满足该描述的点被标记了,然后从右图到左图再描述一次,要是已经被标记的点依然不满足该描述那么该匹配就被剔除掉了,目前的理解就是这样,详细的过程可以请教Christos;
五、Network orientation,文章算法里的Relative orientation并不是仅仅选择在拥有最多点匹配的图像对之间去做,而是选择的在拥有最多multi-ray点匹配的图像对之间去做,这样将使得在需要进行前方交会之前有最多可能的图像通过后方交会的方式定向好。
3. Fully Automated Image Orientation in The Absence of Targets (Completed read on 23th Dec. 2014).
这就是Christos和Clive 2012年墨尔本八月底ISPRS大会上投的稿,上一篇文献是对本文的一个补充和总结。因此方法论这一块应该是上一篇文章里描述的更为准确详细,这里就摘录一些本文的文字叙述吧,前言部分提到有其它文章已经阐述了基于自然图像特征的匹配精度能达到0.3个像素的样子,也有人尝试过在特征匹配的基础上进一步跟进一次最小二乘匹配,精度大概能提高到0.25个像素的样子,提升不明显,因此本文作出了图像特征匹配精度很难再进一步提升的论断。文章阐述了在对wide baseline图像进行匹配的时候,为了保证能有足够多的特征点参与匹配,在特征检测的过程中最好不要强加很强的响应阈值,或者说直接不加任何响应阈值,以获得足够多的特征点,否则在大基线的情况下因为基线或者会聚角一大特征点的相似性就下降了本来能配上的点就少,要是一开始检测到的能够来参与匹配的特征就少那更加影响匹配的成功率。
这篇文章对上文中利用projective tranformation剔除匹配outliers进行了详细的描述,我的理解是该算法先对左图中提取出来的一系列图像特征点进行二维的迪罗尼三角网格化,然后利用得到的一个个三角形的三个点去和对应的右图上的匹配的三个点估计一个之间的仿射变换参数,并对各估计的仿射参数在参数空间内进行聚类,拥有较少元素的聚类被认为是一些孤立的参数集,它们联系的图像点的匹配就被当作outliers剔除掉,这是利用三角网格估计仿射变换参数的方式,文中还描述了利用四边形网格估计射影变换参数的方式,并通过实验说明射影变换的方式更优于仿射变换的方式,因为仿射变换仅仅适合于小图像区域的情形,不能描述大图像区域的情形,利用文中构建四边形网格的方式是在上述三角形网格的基础上拆掉相邻三角形的共有边来构建的四边形网格。
4. A Public System for Image Based 3D Model Generation (Completed read on 26th Dec. 2014).
这篇文章是ARC3D http://www.arc3d.be/ 提供的两篇参考文献之一,作者为David Tingdahl和Luc Van Gool (SURF的作者之一),发表于2011年。
在文章的previous work中提到ARC3D在2005年就已经上线运行,至今已经有9个年头了,堪称所有在线三维重建服务的鼻祖。同样的服务还有微软的PhotoSynth以及最近的3dTubeMe。
ARC3D的重建流程为:
一、首先对用户上传的图像内参数进行预标定,一般头像的EXIF数据中会包含有物理焦距信息,但是不一定包含像元尺寸信息,这时系统就在互联网上自动的搜索像机的像元尺寸参数,有了这两个信息之后就可以得到大致的等效焦距信息;
二、在每一幅图像上提取SURF特征点,并且为每个图像对进行特征点匹配,对于两幅图像都预先有内参数初值的,采用5点算法RANSAC计算本质矩阵来匹配,否则就采用7点算法RANSAC计算基础矩阵。
三、自标定,这是可选步骤,如果所有输入图像中少于两幅图像预先知道内参数,那么就采用Web-based 3D reconstruction service (ARC3D提供的另外一篇参考文献)一文中描述的自标定算法来标定内参数,但是这种方法在图像内参数不恒定,以及像机运动(turntable motion)和场景结构不够general (为平面)时会失效;
四、稀疏重建,为了保证足够的基线,通过检查两幅图像之间的关系是否可以很好的用一个无穷单应(infinite homography)来描述来判断两幅图像是否有足够长的基线,如果可以就说明两图像的基线太短,这一方法在3D Reconstruction from Multiple Images: Part 1 - Principles一文中有详细描述,每个新加入的图像通过3个已有的重建点进行后方交会来确定外定向,并且跟进光束法平差优化,平差的参数有6个外定向参数、一个等效焦距值以及2个径向畸变系数;
五、密集重建,稀疏重建结果被用来初始化密集重建,利用已得到的图像定向关系,将所有重叠的图像串成链条,然后进行极线矫正,并采用基于动态规划的dense stereo算法来估计视差图(Visual Modeling with a Hand-Held Camera)。Stereo pairs被串成链,并且每个像素的最优深度通过Kalman滤波跟踪出来。密集重建方法同时还提供质量图,每个像素估计的质量通过正确匹配上的图像个数来表征。
文章中提出了一种view selection策略来从所有的深度图中只选择若干幅来进行后续的meshing,这样做的理由的是很多的图像之间有大量的重叠区域会导致meshing过程中大量不必要的计算量,再者就是低质量的深度图也参与meshing的话会导致meshing的质量下降。很显然这里的view selection和之前我了解的那个view selection指的不是一个意思,一般view selection是指的在密集重建时基于某种准则为参考图像选择若干合适的匹配图像。这里为meshing的view selection的准则是尽可能减少overlap的同时要尽可能多的cover整个重建场景,还有就是倾向于选择高质量的深度值参与meshing。文章里判断coverage时不是用的密集点,而是用的稀疏重建点去判断的。
在真正做meshing之前,先对所有的深度图进行剔除outliers的操作,有3步骤,首先删除那些少于三幅图像观测到的深度图的像素,接着按深度聚类,只保留最大连通的深度区域,其它的像素全部删除,最后做一个腐蚀操作,剔除掉深度边界可能的噪声深度点。之后文章还有一步所谓的Depth map to 3D,将深度图反投影至空间中,并通过连接邻近点得到一个粗糙的mesh,剔除那些法向和光轴夹角太大的triangles,以及那些最短边比最长边短两倍以上的triangles。上两步之后,就是用的Poisson表面重建方法来做真正的meshing,格网之后,剔除那些拥有边长比所有网格边平均长度还长5倍的triangles。
形成mesh之后,要为mesh应用纹理,也就是为mesh里的每个faces着色,我看他们的做法是为face在每个图像里做frustum culling(遮挡判断),看face在哪些图像里可见,然后选择可见图像中投影面积最大的那幅图像里的颜色信息来为该face着色。
5. Web-Based 3D Reconstruction Service (Completed read on 28th Dec. 2014).
这篇文章就是ARC3D http://www.arc3d.be/ 提供的另一篇参考文献,作者为Maarten Vergauwen和Luc Van Gool,发表于2006年。
文章里更为详细的描述了他们的系统里是如何为每幅图像计算密集深度图的,算法主要流程分为4大步骤:
一、判断哪些图像对可以用来进行匹配,包括降采样以及Global Image Comparison两步,这个全局图像比较其实就是判断个两图间的相似性;
二、先为上一步中得到的所有图像对进行特征匹配,然后选择若干组三视图组进行射影重建,并基于此进行像机自标定,得到图像的内参数;
三、欧氏重建以及将深度图upscale至原分辨率;
四、密集重建。
文章的算法一开始就对所有的输入图像降采样至最大1000×1000的图像,然后后续操作在upscale之前全都是在这些小分辨率的图像上去做。
这篇文章涉及的内容还比较多,详细的阐述这里就不复述了,还是参见原文,他里面的Global Image Comparison方法还有点意思,是将所有图像进一步降采样至最大只有100×100,然后直接通过平移窗口在两视图间去算NCC去判断的相似性的,有点意思。
6. Where is photogrammetry heading to? State of the art and trends (Completed read on 16th Feb. 2015).
这是2015年最新出来的一篇综述性的文章,文章里就Image orientation, surface reconstruction and object restitution三个基本方面对Photogrammetry和Computer vision进行了对比。
文章里出现了Automatic block orientation这个术语,block orientation具体指的什么意思我没有看太明白。文章里还较为详细的描述了在三视图参与匹配时如何剔除误匹配,其中提到了一种data snooping的local bundle solution方法,这个方法是我接下来要去学习的内容。
之后文章中又出现一个Bundle block adjustment的术语,这个block在这里指的什么,这个光束法平差和我知道的光束法平差的差异在哪里我也不太清楚。文章提到CV领域在做光束法平差时往往采用LM算法,而摄影测量领域往往采用Gauss-Newton方法,另外CV领域做BA一般不用Ground control points,而摄影测量领域则有GCPs,文章说BA里不用GCPs的话会产生block deformations,且image orientation的好坏不能仅从重投影残差来看,还得使用check points,这些个情况也是我需要进一步了解的,我一直认为BA过程中不需要控制点,只需要固定某一个图像的坐标系即可,其它的全部可以自由平差。
7. Orientation and 3D Modelling from Markerless Terrestrial Images: Combining Accuracy with Automation (Completed read on 20th Feb. 2015).
这篇文章以及接下来的两篇文章都是上一篇文献中介绍data snooping时列出来的参考文献。该文是Luigi Barazzetti于2010年在The Photogrammetric Record上发表的一篇期刊文章。
文章提出的方法主要是针对利用calibrated cameras拍摄的图像来进行三维重建,并且提到在weak image network的时候最好避免self-calibration(自检校),可以想象在image network不好的时候进行自检校光束法平差出来的重建结果不可靠,因为自检校光束法平差时内外参耦合严重,外参数的一部分误差可能会融入到内参数误差里,即使最终残差会少不少。
文章方法的第一步也是检测SIFT或者SURF特征点,然后通过描述子来进行特征匹配,第三步就是利用基于epipolar geometry的robust techniques来大量剔除匹配outliers,当图像内定向未知时该对极几何用基础矩阵F表示,内定向已知时则可以考虑用本质矩阵E表示,并通过Nister(2004)提出的5点算法来求解,文中介绍了3种robust techniques: RANSAC, LMedS (least median of squares) and MAPSAC (maximum a posterior sample consensus),并介绍了3种方法各自的优缺点,并指出MAPSAC的使用能带来significant solution improvement。
接下来文中方法采用最小二乘匹配(LSM)来进一步提高各匹配同名像点的定位匹配精度,虽然文中没有明确说明,但是既然要使用LSM,那么肯定是以某一个图像里同名像点为中心抠出来了一块参考窗口,并在其它各匹配图像中去做LSM的。
文中还引用了Clive 96年的一篇文章里的一个根据像点提取精度来推算重建空间点精度的经验公式,并以此出发提到图像特征被越多的图像观测到会带来越高的稀疏重建精度以及图像定向精度。因此在上述步骤之后,文中方法进一步在每一幅图像上提取FAST角点特征,因为FAST相对于SIFT和SURF有着更高的repeatability and better distribution in the images。提取的FAST特征点是通过基于collinearity geometry的multi-image constrained LSM来进行匹配的,这一步骤我没有太明白到底是怎么做的,文中指出points are projected onto the images,难道是先交会出来?但是交会的时候怎么识别误匹配呢?文中没有说对FAST特征点也去生成特征描述并进行特征描述匹配,我自己想了下一个可行做法就是每个图像里的每个FAST特征点都在其它图像中去做LSM,但这样做似乎又不是文中所说的multi-image constrained LSM,所以这一块具体是怎么做的我还没有理解太透彻。
完成所有图像的定向之后就是进行文中所谓的surface measurements,也就是相当于密集表面重建吧,但是经过我的反复阅读,我认为文中方法并不是企图为每幅图像的每个像素都估计一个深度和法向,按我阅读后的理解,他应该是这么去做的,首先也是建立了金字塔,即为每幅图像生成了不同分辨率的金字塔图像,在每一层都进行了以下步骤:在图像上划分均匀的image grid,每个格子里都提取了 Lue interest points,每个interest points的初始深度和法向估计通过多个邻近的在之前网络定向环节得到的稀疏点来插值得到,然后以该interest point为中心,抠一块矩形区域来按当前法向沿深度方向上去移动,并与其它多个匹配图中重采样出来的窗口去计算NCC值,并取所有NCC值之和(SNCC)最大的深度为该interest point处当前最优的表面深度估计,这整个过程被称为 geometrically constrained cross-correlation (GC3),调整的应该只有深度,而没有法向,但不知道作者是怎么去调整深度的,是等间隔采样还是怎么着?也不清楚window warping是基于什么模型去做的,即一个窗口里对应的空间surface是通过几个什么参数来描述的,这些文中都没有说清楚。
然后文中说利用MPGC LSM在原图分辨率上来进一步提高匹配精度,这里用的MPGC LSM是Gruen原始的方法,不知道该原始MPGC里面调整的参数有哪些,我觉得至少应该有沿点心射线上的深度值,然后作为一种表面估计方法,它里面是如何描述和调整表面法向的我还不太清楚,但我看到有一句话就是while the affine parameters converge during the iterations,难道参考窗口和每个匹配窗口之间的形变还是通过仿射模型来描述的?那每个不同匹配窗口岂不是都拥有自己不同的仿射参数?那优化的参数可就多了去了,anyway,我还是阅读完Gruen的原文后才能有发言权。
看完该文的密集表面重建方法,我感觉跟我自己的方法有相似的地方,但也还是有很多不同的地方。
8. Experiences and Achievements in Automated Image Sequence Orientation for Close-Range Photogrammetric Projects (Completed read on 22th Feb. 2015).
该文是Luigi Barazzetti于2011年发表的一篇SPIE的会议文章。相比上一篇期刊文章,这篇文章内容要精简很多,但也有些值得学习的点。
例如在提取图像特征(SIFT或者SURF)并完成匹配后,肯定会出现图像某些纹理丰富的区域提取出非常密的特征点,有些纹理弱一点的区域就只有非常稀疏的特征点,也就是说图像特征分布不是很均匀,那么文中方法就这么处理:先在图像划分均匀网格,每个网格里只保留multiplicity最高的特征点,也就是在最多图像上成功匹配的特征点,这样做的话就不会出现物方某一小块区域重建出大量的密集点,而有些区域只重建出少量点,就相当于光束法平差的时候某一块区域的物点的权重较大,而另一些区域的权重较小了,这也算是一种weak geometry吧。
文中还指出虽然在匹配环节通过基于对极几何的robust techniques能剔除掉大量的匹配outliers,但也没法完全确保光束法平差的时候百分之百的没有outliers,因此在多图光束法平差的时候还是有必要利用data snooping来在平差迭代过程中进一步剔除outliers。文中在实验结果中还列了一个重建结果,利用本文的方法由于在bundle迭代过程中剔除了几个wrong data使得最终成功的完成了所有图像的定向和稀疏重建。但是利用Autodesk Photofly以及Microsoft Photosynth处理同一组图像则都失败了,文中总结其原因就是most probably due to the repeated patterns in the scene and the employed bundle adjustment.
在讨论部分文章指出stability of the solution依赖于两类点:
1. tie points (TPs), which guarantee the precision of the orientation solution; they should be numerous, well distributed on the object and in the image space and they should feature a high multiplicity;
2. ground control points (GCPs), which have the role to fix the datum and to control the block deformation.
最后还指出SfM的精度依赖于tie points的measurement precision, multiplicity and spatial distribution.
9. Comparison of Two Structure and Motion Strategies (Completed read on 23th Feb. 2015).
该文是R. Roncella于2011年在International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences上发表的一篇文章。
题目中的两种SaM策略其实就是作者自己的一个软件中先后采用的两种策略,最新的策略和老策略的区别就在于新策略采用了SIFT和SURF这种图像特征以及匹配方式;第二个区别就在于利用基于epipolar/trifocal几何约束的robust techniques剔除outliers时,新策略充分利用了已知内定向的约束,比方说就是把之前鲁棒估计F换成了鲁棒估计E来剔除outliers,就这么简单,详细的过程可以参考原文,这里不再赘述了。
2014年11月12日星期三
网购Tamron 24-70mm f/2.8 Nikon mount到货
周六凌晨在eglobal订购的Tamron 24-70mm f/2.8 Nikon mount今天终于是到货了,包装还算完好,但是感觉有点折痕,稍显旧,不知道是不是邮寄颠簸导致的。
加邮费总共花销931澳币,折合人民币4925元,比国内网上报的均价还是能便宜到近一千元,看过网上的的测评,拿此副厂镜头和尼康的原厂24-70mm f/2.8镜头比也不输毫厘,在锐度上有时甚至更优,真是性价比非常高的一款镜头,只是目前手上还没有尼康的相机可以直接试试画质的,不知道这几天能找谁借个机身试一下不,看完画质才能最终放心下来。
镜身上赫赫的标着Made in Japan。
加邮费总共花销931澳币,折合人民币4925元,比国内网上报的均价还是能便宜到近一千元,看过网上的的测评,拿此副厂镜头和尼康的原厂24-70mm f/2.8镜头比也不输毫厘,在锐度上有时甚至更优,真是性价比非常高的一款镜头,只是目前手上还没有尼康的相机可以直接试试画质的,不知道这几天能找谁借个机身试一下不,看完画质才能最终放心下来。
镜身上赫赫的标着Made in Japan。
订阅:
评论 (Atom)