opencv - 图像对齐方式warpPerspective或warpAffine

标签 opencv image-processing 3d computer-vision homography

我在3D场景中有一个对象的两个图像I1和I2。图像之间的区别在于对象已移动。摄像机的位置和校准是已知的,对象上的几个3D特征点以及移动它的3D变换也是已知的。我也有那些特征点的投影。

我想对齐图像。所以看来我有两种选择:

  • 我可以仅查看2D特征点并派生仿射变换来进行对齐。凭直觉,这似乎会出错,因为它不能解决透 View 失真。
  • 我可以找到单应性变换并使用warpPerspective进行变换。我是单应变换的新手,但听起来这将考虑透视变形。实际上,通过我的设置,我相信单应性矩阵很简单:反转投影矩阵,反转3D变换,然后重新投影。这将得出x'= Hx。看来它将给我确切的图像对齐方式。

  • 那么第一个问题:warpPerspective是否会比warpAffine给出更好的对齐结果?

    第二个问题:并非所有特征点都位于同一平面上。我还能使用warpPerspective吗?我想我为单应变换阅读时,这些点必须在同一平面上。

    第三个问题:由于单应变换是3x3,这意味着我需要知道图像中每个像素的z坐标才能进行变换?

    谢谢。

    最佳答案

    仿射变换是图像平面2D变换。它不考虑平面外转换。

    单应性为平面的透视变换建模。因此可以例如用于向后倾斜的飞机。

    如果您的对象是平面的,但可以进行平面外旋转,则您需要使用单应性对其进行建模。

    如果您的模式不是平面模式,则单应性不是真正的模型。话虽如此,通常这是一个足够的近似值。平面外的点将被错误地扭曲。

    关于opencv - 图像对齐方式warpPerspective或warpAffine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180434/

    相关文章:

    c++ - 如何编写查找表来映射像素强度 (OpenCV)

    c++ - OpenCV findFundamentalMat 奇怪的行为

    c# - Cv2.CountNonZero返回意外结果

    JavaFX 如何获取 3D 场景中对象的坐标

    javascript - Three.js:寻找生成对象并为曲线上的对象设置动画

    Java openCV - 将位图转换为 Mat 时出错

    python - OpenCV2 : grayscaled video displays fine, 但不保存

    flash - 如何使用 actionscript 3 读取/解析曲线调整 (*.acv) 文件

    c++ - 按质量/连通性对像素进行分组以进行图像处理 (OpenCV)

    Python 脚本(主要)+ Blender "face"动画