java 鱼眼照片的矫正_使用OpenCV校准鱼眼镜头
使用
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校准鱼眼镜头相关推荐
- java 鱼眼照片的矫正_鱼眼镜头立体声校准OpenCV,Python
我使用本教程link成功校准了我的相机作为参考 . 这是代码: CHESSBOARD_SIZE = (9,6) img_dir_left = "/home/dir_left" im ...
- python鱼眼图像识别_使用OpenCV校准鱼眼镜头的方法
01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇 ...
- python opencv 相机标定_使用OpenCV校准鱼眼镜头的方法
01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇 ...
- opencv鱼眼矫正Java_使用OpenCV校准鱼眼镜头
重磅干货,第一时间送达 01.简介当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤, ...
- 使用OpenCV校准鱼眼镜头-第2部分
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在昨天的文章中我们介绍了有关如何使用OpenCV校准鱼眼镜头的一些 ...
- 鱼眼相机成像模型以及基于OpenCV标定鱼眼镜头(C++)
opencv系列 文章目录 opencv系列 一.鱼眼镜头模型 二.投影函数 等距投影模型 等立体角投影模型 正交投影模型 体视投影模型 三.OpenCV中的鱼眼相机模型 四.标定(C++)实现 使用 ...
- 使用OpenCV校准鱼眼镜头
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中 ...
- 基于OpenCV的鱼眼相机畸变矫正(含代码)
首先展示一下实现的效果: 校正前: 校正后: 本文分为两部分,一部分是介绍鱼眼相机畸变校正的原理,一部分是手撕OpenCV相机矫正代码. 文章主要结构如下图所示: 一.介绍鱼眼相机的原理 1.什么是鱼 ...
- opencv使用经纬法把鱼眼照片展开
前两天工作需要买了一个佳能8-15mm的鱼眼镜头,8mm镜头其实成像就是180度的鱼眼镜头,成像效果如下图: 这里因为买的相机body是全画幅的,CCD长宽比是3:2的,所以调至镜头到8mm是不能占满 ...
最新文章
- 物体检测中的评价指标【文末赠书】
- python编程入门t-python高级编程——入门语法(二)
- django1.4 关于处理静态文件的问题
- 19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行
- Laravel 5 4 实现前后台登录
- Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)
- 正则表达式学习笔记009--大括号与选择符的认识与应用
- Redis设计与实现笔记 |目录
- windows10用户密码获取
- c语言统计单词平均长度,C++ 字符数组 - 统计一段英文单词的平均长度
- 如何通过QQ邮箱获取授权码
- 用python放烟花咯
- int,long和long long的区别
- execute,executeQuery和executeUpdate的区别
- matplotlib sci论文画图技巧
- mysql 验证用户名重复,Ajax案例——检验用户名是否重复
- linux中的快捷键大全
- 读书笔记之JVM垃圾回收
- 德国有史以来最昂贵电影[Perfume]:《香水:杀手故事》简介:
- 输出1-100中3的倍数
热门文章
- 本地html页面录音,JavaScript实现页面中录音功能的方法
- linux下printf终端打印输出颜色控制
- 帆软报表列表_帆软入门与报表设计
- 在LINUX用玩英杰传曹操传
- 计算机组装与维修教学重点,计算机组装与维修教学大纲.pdf
- Tencent Linux操作系统宣布开源
- .NET后台字符中转JSON,和JSON字符串转对象
- NLP顶会论文写作技巧个人总结!
- 安装android 像windows,【图片】不需U盘,简单三步,Win系统变Win+Android双系统!【androidx86吧】_百度贴吧...
- 可燃气体在线监测无线传输终端