我使用opencv为2台摄像机成功校准了内在函数和外部函数(左侧为低分辨率凸轮,右侧为高分辨率凸轮)。我从2组图像中立体校准(棋盘图案 - 每个相机约20幅图像)。我现在有一个left.yml,right.yml和一个translationRotation.yml。现在我想扭曲/扭曲正确的图像,使它看起来与左图像相同(透视/失真/等)。我知道我拥有校准的所有数据,它只是知道如何使用正确的opencv函数来执行操作 - 例如。 warpPerspective,remap,还是别的什么?
背景信息 - 我基本上用高分辨率rgb相机输入(右)替换低分辨率rgb相机输入(左)。使用Openframeworks / c ++和ofxCv。
感谢。
答案 0 :(得分:2)
如果我理解正确,你会对每个相机产生不同的扭曲,并且你想要使其中一个失真并应用另一个相机的失真。对于非失真部分,这是我过去所做的。
使用OF,在设置时,您可以使用cv::initUndistortRectifyMap
创建失真/不失真地图,这将为您提供cv::Mat
个对象形式的两张地图。该功能从校准中接收相机矩阵和失真系数。
然后,您可以使用cv::remap
应用映射。这将把结果存储在第二个参数中。
在不失真之后你想要应用逆映射,以应用其他相机的失真。看来你提到的warpPerspective函数可以很好地工作,但是映射可能是从你得到的.yml
文件中计算出来的。这只是应用相反映射的问题。
只要有必要确保不进行不必要的复制,请使用ofxCV's wrapping从图像切换到Mat。