在做鱼眼图像矫正时,碰到一个很有意思的情况,即在鱼眼相机FOV比较大时, undistortPoint() 和 undistortImage()对应点的结果不一致。
两个函数的调用如下:
浅蓝色的点是画在原始图像上的。
浅蓝色的点随着图像undistortImage()矫正后的位置。
原始图像上的点(原始图像上浅蓝色的点),通过undistortPoint()矫正后的坐标。
此时 undistortPoint() 和 undistortImage() 结果基本一致。
矫正FOV更大时的点
浅蓝色的点通过undistortImage()矫正后的位置。
undistortPoint()计算的鱼眼图像上的点(对于原始图像上浅蓝色的点)矫正后的坐标。
此时两个函数矫正的结果相差比较大。
第一次选择的点和第二次选择的点,在原始图像上相距并不大。我还测量过这两个点中间的点,矫正后差异也很大,感觉就像是突破了某个临界值,过了某个临界值之后,差异就很大。
//----------------------------------------------------
接着上一部分
通过查看opencv中undistortPoint()源码,知道了第二个点为什么差异那么大的原因。如下图。然后测量了我第二个点的theta值,确实是超过了CV_PI/2. 。第一个点就已经很接近CV_PI/2 了。
那为什么 undistortImage()可以矫正大于CV_PI/2.FOV的图像点了。继续扒undistortImage()的源码,可以看到,这里未对r的角度范围做判断。
所以如果要undistortPoint()矫正FOV很大的点,可以把opencv中的代码拔出来,自己写。