1.摄像机成像原理
2.成像畸变
3.畸变解决方案
4.当前畸变问题解决情况
- 相机畸变校正详解 [图像]畸变校正详解_画圆弧曲线拟合畸变校正算法_祥知道的博客-CSDN博客
- 相机畸变矫正 相机畸变矫正_GZheng2007的博客-CSDN博客
- 相机畸变矫正原理及代码实现 相机畸变矫正原理及代码实现_超级无敌小小顺利的博客-CSDN博客
- 相机标定之畸变矫正与反畸变计算 https://www.cnblogs.com/mafuqiang/p/8134617.html
- 双目相机的畸变校正以及平行校正(极线校正)的入门问题总结 双目相机的畸变校正以及平行校正(极线校正)的入门问题总结
- 相机(RGB&DEPTH)畸变矫正的通俗理解 相机(RGB&DEPTH)畸变矫正的通俗理解 - 知乎
- OpenCV相机标定与畸变校正 OpenCV相机标定与畸变校正_图像
1.摄像机成像原理
摄像机成像的过程实质上是坐标系的转换,空间中的点从世界坐标系转换到摄像机坐标系,然后再投影到图像坐标系(成像平面),再将数据转换到图像坐标系。具体转换如下:
转换的数学表达式如下所示:
★ RT01矩阵:相机外参,是相机相对于世界坐标系的旋转和平移变换关系。
★ 3*3矩阵:相机内参,是相机的固有属性,含有焦距、像元尺寸等参数。
2.成像畸变
图像的畸变主要有两种:径向畸变和切向畸变。
径向畸变:正中心位置的畸变最小,随着半径的增大,畸变增大。径向畸变可以分为枕形畸变和桶形畸变:
切向畸变:在透镜与成像平面不平行时就会产生,类似于透视变换。
3.畸变解决方案
本次主要解决横向畸变情况,主要包括以下步骤
1.通过标定板(棋盘图)采集图像,尽量在视野范围内多采集不同角度不同位置的图片;
2.提取标定图片的角点信息;
3.进一步获取标定图片的亚像素点信息;
4.在棋盘图上绘制找到的内角点(尽量使用长款不同的标定板,以便模型更好识别横向和纵向);
5.利用算法模型计算畸变系数,内参数,外参数(平移参数,旋转参数);
6.使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数;
6.对未标定图片进行畸变矫正;
7.通过反投影误差评估矫正的好坏。
4.当前畸变问题解决情况
参考:
- 相机畸变校正详解 [图像]畸变校正详解_画圆弧曲线拟合畸变校正算法_祥知道的博客-CSDN博客
- 相机畸变矫正 相机畸变矫正_GZheng2007的博客-CSDN博客
- 相机畸变矫正原理及代码实现 相机畸变矫正原理及代码实现_超级无敌小小顺利的博客-CSDN博客
- 相机标定之畸变矫正与反畸变计算 https://www.cnblogs.com/mafuqiang/p/8134617.html
- 双目相机的畸变校正以及平行校正(极线校正)的入门问题总结 双目相机的畸变校正以及平行校正(极线校正)的入门问题总结
- 相机(RGB&DEPTH)畸变矫正的通俗理解 相机(RGB&DEPTH)畸变矫正的通俗理解 - 知乎
- OpenCV相机标定与畸变校正 OpenCV相机标定与畸变校正_图像
import cv2
import numpy as np
def rectify_video(image, map1, map2):
frame_rectified = cv2.remap(image, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
return frame_rectified
def calculate_para(K, D, width, height):
# 优化内参数和畸变系数
p = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(K, D, (width, height), None)
# 此处计算花费时间较大,需从循环中抽取出来
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, None, p, (width, height), cv2.CV_32F)
return map1, map2
def main():
# K D 参数
K = np.array(
[[1201.3967181633418, 0.0, 909.7424436183744], [0.0, 1203.635467250557, 534.1590658991514], [0.0, 0.0, 1.0]])
D = np.array([[-0.0978537375125563], [-0.03841501213366177], [-0.03612764818273854], [0.05276041355808103]])
width, height = 1920, 1080
# 参数优化
map1, map2 = calculate_para(K, D, width, height)
video = cv2.VideoCapture("filename.jpg")
while (video.isOpened()):
success, image = video.read()
if not success:
break
# 畸变矫正
frame = rectify_video(image, map1, map2)
frame = cv2.resize(frame, (960, 540))
cv2.imshow('frame', frame)
if cv2.waitKey(0) & 0xFF == ord('q'):
break
video.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()