【发布时间】:2020-11-08 07:42:12
【问题描述】:
我构建了一个立体相机移动应用程序,该应用程序使用 findTransformEcc 执行自动对齐,并且该应用程序与它配合得很好。我知道我可能应该在关键点和描述符等之前使用 rectifyStereoUncalibrated,但是尽管尝试了许多不同的方法,但我得到了不好的结果,我非常沮丧。所以相反,我坚持使用 findTransformEcc(至少现在是这样)。目前我正在使用 MotionType.Euclidean(仅限于平移和旋转),但我想更改它。
到目前为止,该应用程序的工作原理是让用户拍摄一张照片并移到一边以捕捉下一张照片(chacha 方法)。但现在我添加了让两部手机同时捕获的功能。问题是两个相机的焦距和传感器尺寸(视场角)可能不同,所以为了对齐两张图片,我需要允许缩放/缩放。但是,如果我想用 findTransformEcc 做到这一点,我只能从 Euclidean 升级到 Affine,似乎我不能介于两者之间。也就是说,似乎我不能在不允许剪切的情况下进行缩放,而且我不想要剪切。
作为解释这一点的另一种方式,我想获得可以从 estimateRigidTranform(array,array,FALSE) (部分仿射)获得的变换类型,而不是像该函数那样使用关键点,我想使用 findTransformEcc,因为从我的实验来看,它似乎更可靠。
(https://github.com/KRA2008/crosscam/blob/develop/AutoAlignment/OpenCV.cs 是自动对齐代码,如果有帮助的话)
【问题讨论】:
-
难道不是用
MotionCriteria==MotionType.Affine调用CvInvoke.FindTransformECC来像CvInvoke.EstimateRigidTransform那样返回仿射变换吗? emgu.com/wiki/files/3.4.1/document/html/… -
另外,我不确定,但我的理解是,您可以简单地省略 [0,1] 和 [1,0] 处的剪切值,标量位于 [0, 0] 和 [1,1]?
-
@GeorgeKerwood 我从文档(和我的实验)中了解到,将
MotionCriteria == MotionType.Affine与CvInvoke.FindTransformECC一起使用类似于CvInvoke.EstimateRigidTransform与true用于FullAffine 参数。问题是我看不到false的模拟是什么。这是“介于”MotionCriteria == MotionType.Affine和 ``MotionCriteria == MotionType.Euclidean` 之间的东西 -
这是
EstimateRigidTransform的文档,它解释了完整仿射的true/false:docs.opencv.org/2.4/modules/video/doc/… -
@GeorgeKerwood 回复您的第二条评论:听起来确实可能是我不得不求助的方法,但我不喜欢它。看起来它会导致一些不太理想的结果。我的理解是,当算法进行估计时,它会一点一点地调整参数并调整变换矩阵以获得最佳匹配,但如果最后我只是砍掉一些组件,它不会被优化到与如果算法一直被限制为部分仿射。
标签: opencv emgucv affinetransform stereoscopy