使用

01.简介

当我们使用的鱼眼镜头视角大于160°时,

如果小伙伴也遇到了类似情况,那么这篇文章可能会对大家有一定的帮助。

从3.0版开始,OpenCV包含了cv2.fisheye可以很好地处理鱼眼镜头校准的软件包。但是,该模块没有针对读者的相关的教程。

02.相机参数获取

校准镜头其实只需要下面2个步骤。

利用OpenCV计算镜头的2个固有参数。OpenCV称它们为K和D,我们只需要知道它们是numpy数组外即可。

通过K和D对图像进行去畸变矫正。

计算K和D

下载棋盘格图案并将其打印在纸上(字母或A4尺寸)。大家要尽量将这张纸粘在坚硬且平坦的物体表面,例如一块硬纸板上。因为这里的关键是直线必须是直线。

将图案放在相机前面拍摄一些图像,图案要取在不同的位置和角度。这里的关键是图案需要以不同的方式出现失真(以便OpenCV尽可能多地了解镜头相关参数)。

我们先将这些图片保存在JPG文件夹中。

现在我们只需要将此

import cv2

assert cv2.__version__[0] == '3', 'The fisheye module requires opencv version >= 3.0.0'

import numpy as np

import os

import glob

CHECKERBOARD = (6,9)

subpix_criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)

calibration_flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC+cv2.fisheye.CALIB_CHECK_COND+cv2.fisheye.CALIB_FIX_SKEW

objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)

objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)

_img_shape = None

objpoints = [] # 3d point in real world space

imgpoints = [] # 2d points in image plane.

images = glob.glob('*.jpg')

for fname in images:

img = cv2.imread(fname)

if _img_shape == None:

_img_shape = img.shape[:2]

else:

assert _img_shape == img.shape[:2], "All images must share the same size."

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Find the chess board corners

ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)

# If found, add object points, image points (after refining them)

if ret == True:

objpoints.append(objp)

cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),subpix_criteria)

imgpoints.append(corners)

N_OK = len(objpoints)

K = np.zeros((3, 3))

D = np.zeros((4, 1))

rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]

tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]

rms, _, _, _, _ = \

cv2.fisheye.calibrate(

objpoints,

imgpoints,

gray.shape[::-1],

K,

D,

rvecs,

tvecs,

calibration_flags,

(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)

)

print("Found " + str(N_OK) + " valid images for calibration")

print("DIM=" + str(_img_shape[::-1]))

print("K=np.array(" + str(K.tolist()) + ")")

print("D=np.array(" + str(D.tolist()) + ")")

运行python calibrate.py。如果一切顺利,脚本将输出如下内容:

Found 36 images for calibration

DIM=(1600, 1200)

K=np.array([[781.3524863867165, 0.0, 794.7118000552183], [0.0, 779.5071163774452, 561.3314451453386], [0.0, 0.0, 1.0]])

D=np.array([[-0.042595202508066574], [0.031307765215775184], [-0.04104704724832258], [0.015343014605793324]])

03.图像畸变矫正

获得K和D后,我们可以对以下情况获得的图像进行失真矫正:我们需要取消失真的图像与校准期间捕获的图像具有相同的尺寸。也可以将边缘周围的某些区域裁剪掉,来保证使未失真图像的整洁。通过undistort.py使用以下python代码创建文件:

# You should replace these 3 lines with the output in calibration step

DIM=XXX

K=np.array(YYY)

D=np.array(ZZZ)

def undistort(img_path):

img = cv2.imread(img_path)

h,w = img.shape[:2]

map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2)

undistorted_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)

cv2.imshow("undistorted", undistorted_img)

cv2.waitKey(0)

cv2.destroyAllWindows()

if __name__ == '__main__':

for p in sys.argv[1:]:

undistort(p)

现在运行python undistort.py file_to_undistort.jpg。

矫正前

矫正后

如果大家仔细观察,可能会注意到一个问题:原始图像中的大部分会在此过程中被裁剪掉。例如,图像左侧的橙色RC汽车只有一半的车轮保持在未变形的图像中。实际上,原始图像中约有30%的像素丢失了。小伙伴们可以思考思考如果我们想找回丢失的像素该这么办呢?

java 鱼眼照片的矫正_使用OpenCV校准鱼眼镜头相关推荐

  1. java 鱼眼照片的矫正_鱼眼镜头立体声校准OpenCV,Python

    我使用本教程link成功校准了我的相机作为参考 . 这是代码: CHESSBOARD_SIZE = (9,6) img_dir_left = "/home/dir_left" im ...

  2. python鱼眼图像识别_使用OpenCV校准鱼眼镜头的方法

    01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇 ...

  3. python opencv 相机标定_使用OpenCV校准鱼眼镜头的方法

    01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇 ...

  4. opencv鱼眼矫正Java_使用OpenCV校准鱼眼镜头

    重磅干货,第一时间送达 01.简介当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤, ...

  5. 使用OpenCV校准鱼眼镜头-第2部分

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在昨天的文章中我们介绍了有关如何使用OpenCV校准鱼眼镜头的一些 ...

  6. 鱼眼相机成像模型以及基于OpenCV标定鱼眼镜头(C++)

    opencv系列 文章目录 opencv系列 一.鱼眼镜头模型 二.投影函数 等距投影模型 等立体角投影模型 正交投影模型 体视投影模型 三.OpenCV中的鱼眼相机模型 四.标定(C++)实现 使用 ...

  7. 使用OpenCV校准鱼眼镜头

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中 ...

  8. 基于OpenCV的鱼眼相机畸变矫正(含代码)

    首先展示一下实现的效果: 校正前: 校正后: 本文分为两部分,一部分是介绍鱼眼相机畸变校正的原理,一部分是手撕OpenCV相机矫正代码. 文章主要结构如下图所示: 一.介绍鱼眼相机的原理 1.什么是鱼 ...

  9. opencv使用经纬法把鱼眼照片展开

    前两天工作需要买了一个佳能8-15mm的鱼眼镜头,8mm镜头其实成像就是180度的鱼眼镜头,成像效果如下图: 这里因为买的相机body是全画幅的,CCD长宽比是3:2的,所以调至镜头到8mm是不能占满 ...

最新文章

  1. 物体检测中的评价指标【文末赠书】
  2. python编程入门t-python高级编程——入门语法(二)
  3. django1.4 关于处理静态文件的问题
  4. 19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行
  5. Laravel 5 4 实现前后台登录
  6. Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)
  7. 正则表达式学习笔记009--大括号与选择符的认识与应用
  8. Redis设计与实现笔记 |目录
  9. windows10用户密码获取
  10. c语言统计单词平均长度,C++ 字符数组 - 统计一段英文单词的平均长度
  11. 如何通过QQ邮箱获取授权码
  12. 用python放烟花咯
  13. int,long和long long的区别
  14. execute,executeQuery和executeUpdate的区别
  15. matplotlib sci论文画图技巧
  16. mysql 验证用户名重复,Ajax案例——检验用户名是否重复
  17. linux中的快捷键大全
  18. 读书笔记之JVM垃圾回收
  19. 德国有史以来最昂贵电影[Perfume]:《香水:杀手故事》简介:
  20. 输出1-100中3的倍数

热门文章

  1. 本地html页面录音,JavaScript实现页面中录音功能的方法
  2. linux下printf终端打印输出颜色控制
  3. 帆软报表列表_帆软入门与报表设计
  4. 在LINUX用玩英杰传曹操传
  5. 计算机组装与维修教学重点,计算机组装与维修教学大纲.pdf
  6. Tencent Linux操作系统宣布开源
  7. .NET后台字符中转JSON,和JSON字符串转对象
  8. NLP顶会论文写作技巧个人总结!
  9. 安装android 像windows,【图片】不需U盘,简单三步,Win系统变Win+Android双系统!【androidx86吧】_百度贴吧...
  10. 可燃气体在线监测无线传输终端