clomap是作者在ECCV2016年发表的基于两个概率的深度值和法线估计的论文(开源),下面就开源代码Patch_match_cuda.cu文件做简单的介绍
- 产生随机法向量和随机深度值
- 扰动法向量(产生随机三个方位角度)和扰动深度值
- 根据像素坐标计算三维空间坐标
- 传播深度(Since depth θl and normal nl define a local planar surface in 3D, we propagate the depth θlprp -1 of the intersection of the ray of the current pixel xl with the local surface of the previous pixel (θl-1; nl-1))
- 计算入射角(当前参考图像的法向量和原始图像的光线的夹角)和夹角(当前参考图像光线和原始图像光线夹角)
- 原始图像和参考图像的单应矩阵
Step1 工作空间的初始化
- 读入模型
- 建立缓冲区
- 图像下采样(根据精度来设置采样后的大小)
- 法线图和深度图的路径确定
- 深度图范围确定
5.1遍历模型中的三维点,找出这些点所对的图像ID,依次将这些点投影到对应图像的相机坐标系求出对应的深度值
5.2每张图像对应深度范围 ,升序排序深度值
最小值 = 深度值[size*0.01]
最大值 = 深度值[size*0.99]
最小值 = 最小值*(1-0.25)
最大值 = 最大值*(1+0.25)
Step2待处理的问题problem
- 获取model,获取patchmatch配置,像对个数和图像名字
- 构造参考图像和原始图像个数结构体
- 遍历参考图像,计算重叠度(参考图像和左右原始图像的重叠度,稀疏点的角度出发)计算每幅图像夹角(用图像的投影中心和三维点构成的夹角,然后取出所有顺序夹角的75%位置作为最后的夹角)
- 通过图像的夹角和重叠度,夹角大于阈值的情况下,重叠度按照降序排列获取重叠度最高的20张影像作为参考影像的原始影像
Step3 获取cuda个数(API调用)
Step4 初始化线程池
Step5 向线程池仍任务处理
- problem存放原始图像序列和参考图像(缓冲区)深度图,法线图
- patchMatchOption对应配置信息
- 构造 patchMatchCuda
假设 像对 pairCount= 5
3.1按照计算能力设置最好的显卡
3.2 初始化参考图像
参考图像分配显存、参考图像和分配显存、参考图像平方和分配显存
转换行数组,对参考图像进行滤波
滤波结果:
得到双边滤波后的图像,原始图像,双边滤波后的像素平方
3.3初始化原始图像序列
1、颜色图像
2、深度图像
3.4初始化转换矩阵
四个方向的内参矩阵,投影中心,相对转换矩阵和平移矢量,投影矩阵和逆投影矩阵
3.5初始化工作空间
随机状态,深度图,根据每张图像最小值最大值范围随机初始化深度图W*H,初始化法线图W*H*3,概率图W*H* pairCount,前一次概率图(0.5) W*H* pairCount 初始化代价图W*H* pairCount
- 开始执行patchmatch
4.1、计算初始化cost
输入:代价图、深度图、法线图、参考图的局部平方和,参考图局部双边权重和、空域权重、颜色权重
输出:代价图、深度图、法线图
细节:求出单应矩阵,对单应矩阵的颜色值求出NCC,NCC 的值给原始图像row col id
4.2、开始迭代
从上到下开始扫描
4.2.1、定义联合概率函数,计算概率图(反向信息)和初始化前向信息(0.5)
4.2.3 、估算出剩下行计算选择概率
读取反向信息计算概率,并且修正概率
用代价图计算和前向信息计算alpha, betal =概率图
选择概率用alpha betal 权重球的
计算入射角,夹角,图像块面积比例对应的概率
采样概率(ID) = f(选择概率)*f(s1(入射角))*f(s2(夹角))*f(s3(比例))
归一化采样概率并计算累计分布概率
找出产生随机值大于累计分布概率的ID值,累计对应的cost,对剩下的深度值计算对应的cost,找出所有cost最小值对应的深度值和法线,用新的cost来更新选择概率图和前向信息
每张影像,根据深度值求出入射角和夹角,根据这些角度和概率值约束来判断这张影像是不是稳定点,判断这些点的个数是否满足要求来选择当前深度值和法向量