假设我从网络摄像头获取了image1
和image2
。对于image2
,网络摄像头会进行旋转(偏航,俯仰,滚动)和翻译。
我想要的内容:从image2
移除轮播,以便只保留翻译(确切地说:(x,y)
中的跟踪点image2
将是旋转到与image1
中相同的值,以便只保留翻译组件。
到目前为止我做过/尝试过的事情:
image1
和image2
的相应功能。 F
计算基本矩阵RANSAC
以删除异常值。CAM_MATRIX
(fx,fy等)。 F
与CAM_Matrix
(E = cam_matrix^t * F * cam_matrix
) 所以我的想法是:我知道从image1
到image2
的相机移动不会超过20°/ AXIS,所以我可以消除角度太远的至少2种可能性。
对于剩下的2个,我必须对点进行三角测量,看看哪一个是正确的(我已经读过我只需要1,但是由于可能的错误/异常值,应该再做一些以确定哪一个是正确的)。我想我可以使用OpenCV的三角测量功能吗?到目前为止我的想法是否合适?我是否需要计算投影误差?
让我们继续前进并假设我最终获得了正确的R|t
矩阵。
我该如何继续?我试图乘法正常,以及转置旋转矩阵,它应该反转旋转(?)(为了测试目的,我只是尝试了两种可能的R | t组合,我还没有在代码中进行三角测量)跟踪点在image2
。但计算出来的点与它应该的距离太远了。我在这里也需要校准矩阵吗?
那么如何反转应用于image2
的旋转?(确切地说,将反向旋转应用于包含跟踪的std::vector<cv::Point2f>
数组(x,y) )点image2
)
显示反转图像也很不错。这是通过warpPerspective
函数完成的吗?就像this post一样?
(我只是不完全明白T矩阵中A1 / A2和dist的用途是什么,或者我如何采用这个解决方案来解决我的问题。)