鱼眼相机(去畸变) - 知乎

可以先参考经典相机的内外参:无我:相机成像原理-内外参

球面投影模型

正交投影

我们常见的几个经典的鱼眼镜头投影如下:

投影分类

根据投影方式的不同,可以分为以下几类:

  1. 等距投影
  2. 等立体角投影
  3. 正交投影
  4. 体视投影
  5. 线性投影

投影公式

  • “标准”(又名中心透视或直线)无畸变投影的公式为r = f tan θ
  • 球极投影:r = 2f tan (θ/2)
  • 等距(又称等角)投影:r = f θ
  • 等立体角(又名等面积)投影:r = 2f sin (θ/2)
  • 正交(又名正弦律)投影:r = f sin (θ)

图像畸变矫正 & 图像投影矫正

在数字图像中,可以将每个像素位置更改为图像平面中的其他位置(巧妙的使用插值来处理转换过程中可能丢失的信息)来获得另一幅不同的图像。

通过适当的方法来计算和内插和移动像素相对于其初始的位置,初始图像因此可以变换成另一幅新图像。 图像的这种整体或者局部的变换称为"校正"。

Kannala-Brandt模型

怎么用数学来描述鱼眼模型的畸变呢?

观察各种投影方式。发现他们都是一个关于入射角θ的奇函数,因此鱼眼镜头的畸变也是对入射角θ的畸变。

KB模型用只包含奇次项的多项式来描述畸变过程。

Demo

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(Test)
find_package(OpenCV 4 REQUIRED)

message(STATUS "OpenCV_DIR : ${OpenCV_DIR}")
message(STATUS "OpenCV_INCLUDE_DIRS : ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS : ${OpenCV_LIBS}")

include_directories(${OPENCV_INCLUDE_DIRS})  
add_executable(Test main.cpp)  
target_link_libraries(Test ${OpenCV_LIBS})

main.cpp

内参设置参考:

#include <cstdio>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>

using namespace cv;

int main() {
  Mat image;
  cv::Size imgSize;
  std::string image_file = "../aaa.jpg";
  cv::Mat src = cv::imread(image_file);
  cv::Mat distortionResult(imgSize, CV_8UC3);

  // 内参设置

  // K矩阵设置(相机的 fx,fy, cx,cy)
  cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 627.851929, 0.0, 642.351501,
                          0, 628.302795, 363.658875, 0, 0, 1);
  // D vector (distortion coefficients)
  cv::Mat distortionCoefficientsa = (cv::Mat_<double>(1, 4) << 0.46075666,
                                     -0.363318592, 0.00137124187, 0.0018751655);
  cv::Mat newIntrinsicMat(3, 3, CV_64FC1, cv::Scalar(0));
  cameraMatrix.copyTo(newIntrinsicMat);
  // 调整输出校正图的视场
  newIntrinsicMat.at<double>(0, 0) *= 1.0;
  newIntrinsicMat.at<double>(1, 1) *= 1.0;
  // 调整输出校正图的中心
  newIntrinsicMat.at<double>(0, 2) *= 1.0;
  newIntrinsicMat.at<double>(1, 2) *= 1.0;

  cv::fisheye::undistortImage(src, distortionResult, cameraMatrix,
                              distortionCoefficientsa, newIntrinsicMat);

  cv::resize(distortionResult, distortionResult, cv::Size(1280, 720));
  cv::imshow("undistort", distortionResult);
  cv::waitKey(0);
  imwrite("../undistort.jpg", distortionResult);
  return 0;
}

运行结果:

参考网址:

https://cvg.cit.tum.de/_media/teaching/ss2021/visnav_ss2021/visnav_lecture2.pdf


原网址: 访问
创建于: 2024-02-29 14:33:16
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论