图像去畸变
对一张桶形失真的图片进行去畸变
畸变模型有两种:
- 径向畸变:由镜头形状导致
- 切向畸变:透镜与成像平面未严格平行
去畸变代码
int main(int argc, char **argv) {
// 畸变参数
double k1 = -0.28340811, k2 = 0.07395907, p1 = 0.00019359, p2 = 1.76187114e-05;
// 相机内参
double fx = 458.654, fy = 457.296, cx = 367.215, cy = 248.375;
cv::Mat image = cv::imread(image_file,0); // 图像是灰度图,CV_8UC1
int rows = image.rows, cols = image.cols;
cv::Mat image_undistort = cv::Mat(rows, cols, CV_8UC1); // 去畸变以后的图
double x,y,r,xd,yd;
// 计算去畸变后图像的内容
for (int v = 0; v < rows; v++)
for (int u = 0; u < cols; u++) {
double u_distorted = 0, v_distorted = 0;
//利用内参将像素点转化为实际点
x = (u-cx)/fx;
y = (v-cy)/fy;
//计算出该实际点距离原点半径
r = sqrt(pow(x,2)+pow(x,2));
//根据畸变变换公式求原始图像的坐标
xd = x*(1 + k1*pow(r,2) + k2*pow(r,4)) + 2*p1*x*y + p2*(pow(r,2) + 2*pow(x,2));
yd = y*(1 + k1*pow(r,2) + k2*pow(r,4)) + p1*(pow(r,2)+2*pow(y,2)) + 2*p2*x*y;
//利用内参公式将纠正后的原始坐标转换为像素坐标
u_distorted = fx*xd + cx;
v_distorted = fy*yd