假设我有一张由185º视场的鱼眼相机拍摄的畸变图像。
来自《IEEE国际声学、语音和信号处理会议论文集(ICASSP)》, 2016年3月,中国上海,第1541-1545页的图像。 我希望使用FoV模型对其进行矫正,该模型在Frederic Devernay, Olivier Faugeras. Straight lines have to be straight: automatic calibration and removal of distortion from scenes of structured enviroments. Machine Vision and Applications, Springer Verlag, 2001, 13 (1), pp.14-24中有详细解释,具体包括13和14两个方程式。
来自《IEEE国际声学、语音和信号处理会议论文集(ICASSP)》, 2016年3月,中国上海,第1541-1545页的图像。 我希望使用FoV模型对其进行矫正,该模型在Frederic Devernay, Olivier Faugeras. Straight lines have to be straight: automatic calibration and removal of distortion from scenes of structured enviroments. Machine Vision and Applications, Springer Verlag, 2001, 13 (1), pp.14-24中有详细解释,具体包括13和14两个方程式。
rd = 1 / ω * arctan (2 * ru * tan(ω / 2)) // Equation 13
ru = tan(rd * ω) / (2 * tan(ω / 2)) // Equation 14
我已经在OpenCV中实现了它,但无法使其正常工作。我将rd
解释为一个点从光学中心的扭曲距离,将ru
解释为新的未扭曲距离。
我给你一个完整的最小化项目。
#include <opencv2/opencv.hpp>
#define W (185*CV_PI/180)
cv::Mat undistortFishEye(const cv::Mat &distorted, const float w)
{
cv::Mat map_x, map_y;
map_x.create(distorted.size(), CV_32FC1);
map_y.create(distorted.size(), CV_32FC1);
int Cx = distorted.cols/2;
int Cy = distorted.rows/2;
for (int x = -Cx; x < Cx; ++x) {
for (int y = -Cy; y < Cy; ++y) {
double rd = sqrt(x*x+ y*y);
double ru = tan(rd*w) / (2*tan(w/2));
map_x.at<float>(y+Cy,x+Cx) = ru/rd * x + Cx;
map_y.at<float>(y+Cy,x+Cx) = ru/rd * y + Cy;
}
}
cv::Mat undistorted;
remap(distorted, undistorted, map_x, map_y, CV_INTER_LINEAR);
return undistorted;
}
int main(int argc, char **argv)
{
cv::Mat im_d = cv::imread(<your_image_path>, CV_LOAD_IMAGE_GRAYSCALE);
cv::imshow("Image distorted", im_d);
cv::Mat im_u = undistortFishEye(im_d, W);
cv::imshow("Image undistorted", im_u);
cv::waitKey(0);
}
(-575,-543)
具有rd = 790.87
,而FoV模型返回给我的是ru = 0.012
。 - Santiago Gilequation 14
。稍后,Unproject执行与我的代码相同的操作:[xu, yu] = ru / rd * [xd, yd]
。在光学中心附近,它假设没有畸变,因此仅在(rd > 0.01)
时进行校正。我唯一看到的不同之处是它如何计算rd
。让我们试试。 - Santiago Gilf
进行归一化:rd = sqrt((xd/f)^2 + (yd/f)^2)
。焦距以像素为单位。数据集 表明相机的f=1.8mm
,图像分辨率为1088x1088
,传感器尺寸为5.20mm
。因此,我将焦距计算为像素单位1.8 / (5.20/1088)
。但是去畸变仍然无法正常工作。您看到了哪些错误步骤吗? - Santiago Gil