Homography
-
这篇博客比较清晰准确的介绍了关于刚性变换,仿射变换,透视投影变换的理解
-
单应性变换 的 条件和表示
用 [无镜头畸变] 的相机从不同位置拍摄 [同一平面物体] 的图像之间存在单应性,可以用 [透视变换] 表示 。 -
opencv单应性变换求解, 传统方法
cv2.findHomography和cv2.getPerspectiveTransform
两者联系:
都用于计算单应矩阵,即解一个线性方程组。由于单应矩阵有8个未知数(3*3,其中第9个数为1),所以至少需要4个点(每个点-x,y,提供2个约束方程)。两者区别:
计算方法不同:getPerspectiveTransform用的是SVD分解,只需要四个点。
输入参数不同:getPerspectiveTransform只会拿前4个点去计算,findHomography则会拿一堆点(>=4)去计算(其是不断从一堆点中重复拿出4个点去计算出一个结果,再采用一些优化算法RANSAC/LMEDS去筛选出最优解) -
Deep Image Homography Estimation 论文。利用深度学习估计Homography
4.1 HomographyNet的结构
4.2 HomographyNet数据集的制作方法,制作ground truth,进行监督训练
原论文也容易理解github代码有很多, 详细看原论文 或者
可以参考 基于深度学习(HomographyNet)的图像单应性估计)code:https://github.com/breadcake/Deep-homography-estimation-pytorch
有一个问题,4对偏移坐标, 不同scale对应相同转换?
code中四个角选的是长度为128的正方形 -
关于传统方法单应性估计的原理code 可以参考 dastratakos:Homography-Estimation
-
Unsupervised Deep Homography: A Fast and Robust Homography Estimation Model
和无监督光流方法类似,利用warp后的图像建立损失函数,无监督训练
其中 DLT就是 通过4对point 求 H
spatial transformation 就是透视投影 warpdef photometric_loss(delta, img_a, patch_b, corners): corners_hat = corners + delta # in order to apply transform and center crop, # subtract points by top-left corner (corners[N, 0]) corners = corners - corners[:, 0].view(-1, 1, 2) h = kornia.get_perspective_transform(corners, corners_hat) h_inv = torch.inverse(h) patch_b_hat = kornia.warp_perspective(img_a, h_inv, (128, 128)) return F.l1_loss(patch_b_hat, patch_b)
参考代码
和 (https://github.com/breadcake/unsupervisedDeepHomography-pytorch) -
Content-Aware Unsupervised Deep Homography Estimation 2020
该篇论文和6类似,都是无监督学习,只是6把warp等操作放在网络里,7放在了损失函数里.
另外7引入了mask, 以及在损失函数上的创新。
本篇论文鲁棒性更好,因为更多的考虑到非平面场景。
-
关于在pytorch如何实现warp等操作:
1)比如 stn, 后面pytorch引入 gridsample采样函数。
2)比如 kornia 库,也是基于stn. -
最后再介绍一篇 基于深度学习 homography estimation:
Motion Basis Learning for Unsupervised Deep Homography Estimation
with Subspace Projection
code
特征:
1)无监督
2)首先生成8个homography flow, 网络预测8个homo-flow的weight
homography flow 相比light flow 有更多的约束,homography flow是light flow的一个特殊情况,因为homography flow所有pixel的位移是通过一个转换关系得到的,而light flow是更generatic的情况。
3)LRR模块引入网络结构
4)更复杂有效的损失函数
[1]https://blog.csdn.net/abc20002929/article/details/8709902
[2]https://zhuanlan.zhihu.com/p/74597564
[3]https://zhuanlan.zhihu.com/p/37110107