全景图像畸变校正

这篇具有很好参考价值的文章主要介绍了全景图像畸变校正。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简介

理想的相机基本上是小孔成像的,在小孔成像模型中,如果焦距一定,那么图像传感器像素平面的面积直接决定了相机视场角的大小,超过这个视场角范围的物体不会被镜头获取到。因此基于透镜成像原理的相机,视场角无法做到足够大,水平视场角一般小于140°。

但是在一些领域,比如气象科学,科技工作者需要对天空天象变化进行观测,需要有一种相机能将整个半球形天空一次性拍摄下来。而在安防监控领域,安保团队期望有一种相机能从俯视角度一次性拍摄整个监控区域。而为了实现这些目的,就需要相机具有水平180°甚至更大的视场角能力。

就在科研人员陷入苦苦思索的时候,这个时候仿生学义无反顾站了出来。科学家们发现鱼的眼睛在往上看的时候,可以看到水面上整个半球形空间。细究原因,科学家发现由于水的折射率比空气大,光线由空气进入水中后会发生折射,且折射角比入射角要小。同时随着入射角增加,折射角变小的程度也增加。基于这个特性,水面上180°半球形空间的物体就可以被扭曲、压缩到一个有限的成像平面上。
 

全景图像畸变校正

虽然这样大大的增加了视场角,能够看到的角度更大,但是这样也产生了图像畸变的问题。

2.图像畸变

相机的成像过程实质上是坐标系的转换。首先空间中的点由 “世界坐标系” 转换到 “像机坐标系”,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到 图像像素坐标系。但是由于透镜制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。参见:

http://blog.csdn.net/dcrmg/article/details/52950141

http://blog.csdn.net/waeceo/article/details/50580808

由于切向畸变是由于组装工艺的偏差,所以我们大部分主要解决的是图像径向畸变的校正。

3.畸变校正

想要对图像进行畸变校正先要知道几个参数,分别是相机的内参,包括相机的焦距、成像中心和畸变参数;相机的外参,包括旋转矩阵和平移矩阵。如果你详细的知道相机的内参,那么图像校正就很容易,但大多数情况你是不知道的,这样就需要通过相机的标定来得到相机的内参和外参了。

现在最常用的方法是张正友标定法,不知道的去搜一下就了解了。具体的原理有能力的可以了解下,但最重要的还是知道如何使用就行了。

最常用的就是用棋盘格对相机参数进行标定,步骤如下:

1.需要一个棋盘格,精度越高越好,最好整个棋盘格都处于同一平面中,没有凹凸。

2.从多个视角拍摄棋盘格,棋盘格必须全部出现在图像中,最好能出现在图像的各个位置,比如一张图像中棋盘格出现在图像的左上角,一张出现在右上角。最好能够拍摄10~15张图像。

3.用opencv自带的包进行棋盘格角点的检测,得到世界坐标系下角点的坐标objpoint和像素坐标系下角点的像素坐标imgpoint。

4.利用objpoint和imgpoint来标定相机参数,得到相机的内参、畸变系数、旋转矩阵和平移矩阵。

5.利用得到的相机参数对图像进行畸变校正。

4.畸变校正代码

# coding:utf-8
import cv2
import numpy as np
import glob

# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 棋盘格模板规格
w = 9
h = 6
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w * h, 3), np.float32)
objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = []  # 在世界坐标系中的三维点
imgpoints = []  # 在图像平面的二维点

images = glob.glob('D:images\\*.jpg')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w, h), corners, ret)
        cv2.imshow('findCorners', img)
        # cv2.imwrite('D:images\\grid_out.png', img)
        cv2.waitKey(1)
cv2.destroyAllWindows()

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# print(mtx)
# print(dist)
# print(rvecs)
# print(tvecs)
# 去畸变
img2 = cv2.imread('D:images\\10.jpg')
h, w = img2.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))  # 自由比例参数
dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
# 根据前面ROI区域裁剪图片
# x,y,w,h = roi
# dst = dst[y:y+h, x:x+w]
cv2.imwrite('D:images\\grid_out.png', dst)

# 反投影误差
total_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
    total_error += error
print("total error: ", total_error / len(objpoints))

# 校正视频
cap = cv2.VideoCapture('D:video\\video.mp4')
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_size = (width, height)
video_writer = cv2.VideoWriter('D:video\\result2.mp4', cv2.VideoWriter_fourcc(*"mp4v"), fps, frame_size)
for frame_idx in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))):
    ret, frame = cap.read()
    if ret:
      image_ = cv2.undistort(frame, mtx, dist, None, newcameramtx)
      cv2.imshow('jiaozheng', image_)
      # gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
      video_writer.write(image_)
    if cv2.waitKey(10) & 0xFF== ord('q'):
        break
cap.release()
# cv2.destroyALLWindows()

5.其他补充

如果没有标定板或者不方便使用标定板的情况,我们想要标定摄像机参数可以不用角点检测来得到objpoint,可以自己手动标记,最好是在图像中放一些标志物,最好是矩形表格状,如4x4。这样标定虽然有些误差但是也能有不错的效果。文章来源地址https://www.toymoban.com/news/detail-484444.html

到了这里,关于全景图像畸变校正的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(45)
  • python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)

    今天的低价单孔摄像机(照相机)会给图像带来很多畸变。畸变主要有两 种:径向畸变和切想畸变。如下图所示,用红色直线将棋盘的两个边标注出来, 但是你会发现棋盘的边界并不和红线重合。所有我们认为应该是直线的也都凸 出来了。 在 3D 相关应用中,必须要先校正这些畸变

    2024年02月06日
    浏览(48)
  • opencv对相机进行畸变矫正,及从矫正后的图像坐标反求原来的对应坐标

    目前有个项目,需要用到热成像相机。但是这个热成像相机它的畸变比较厉害,因此需要用标定板进行标定,从而消除镜头畸变。 同时需要实现用户用鼠标点击校正后的画面后,显示用户点击位置的像素所代表的温度。 另外热成像sdk中还有个功能:选定一个rect,可以返回这

    2024年02月16日
    浏览(52)
  • 盘点国内前端npm CDN替代方案,基本上可以替代unpkg、jsdelivr

    收集一波常见的加速NPM包的CDN,发现有些还是挺好用的,基本上可以替代unpkg、jsdelivr,用来做博客或者网站加载NPM使用还是可以的。 unpkg.com cdn.jsdelivr.net fastly.jsdelivr.net 使用方法 :直接进官网,搜NPM包名使用。 缺点 :有时候不是很稳定,而且国内有些地方没法访问,jsdel

    2023年04月17日
    浏览(65)
  • 利用Unity开发UI并接入HTC VIVE 手柄(基本上写完了,挖个坑12.1开完会更新)

    Unity 2018.3(之前用2021.3,教程比较少,自己复写很困难,就换了个版本)、HTC Vive Pro 2 专业套装、SteamVR 安装Unity资源包:SteamVR Plugin(SDK要求 1.14.15)、vive input unity、icons(可能还有补充) 比较重要的官方文档: 目前发现了两种做法 第①种将全景视频渲染到整个skybox,让天

    2024年02月05日
    浏览(58)
  • 相机相关:相机模型与畸变模型

    最近在研究相机模型、标定参数相关的内容,因此针对多种相机模型和畸变模型,以及相机坐标系、世界坐标系等等做了一个系统的归纳总结。网上已经有蛮多相关的介绍,这里是基于一个小白的视角进行的归纳梳理,一来是可以帮助自己以后回顾,二来是希望通过自己的笔

    2024年02月22日
    浏览(46)
  • vtk三维场景基本要素 灯光、相机、颜色、纹理映射 简介

    整理一下VTK  三维场景基本要素,后面会一一进行整理; 1. 灯光 vtkLight 剧场里有各式各样的灯光,三维渲染场景中也一样,可以有多个灯光存在。灯光和相机 是三维渲染场景必备的要素,vtkRenderer会自动创建默认的灯光和相机;   vtkLight可以分为位置灯光(Positional Light,也叫聚

    2024年02月20日
    浏览(37)
  • 1、opencv相机畸变矫正

    2.1保存矩阵 2.1直接使用保存的矩阵

    2024年02月11日
    浏览(42)
  • 相机去畸变

    在做图像感知工作过程中会遇到需要处理相机畸变的情况,如SLAM、3D重建等,则需要了解一些常见相机模型的成像过程,以及依据成像过程实现去除相机成像的畸变。 注意:这篇文章并不涉及太多相机参数畸变原理,更多侧重在使用对应相机模型如何实现图像去畸变。 针孔

    2024年02月09日
    浏览(29)
  • 海康线扫相机平场校正/阴影校正教程

    机器视觉海康visionmaster-字符快速识别,字符缺陷检测 为什么要对线阵相机进行平场矫正(PRNUC) 线阵相机需要平场矫正(PRNUC)主要是因为获取得图像有异常,如图像边缘亮度与中心亮度不一致情况等, 对于现场使用相机获取图像数据有较大影响,故而需要对线阵相机进行平

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包