1. 相机标定

根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数。

标定的流程是:

  • 准备棋盘格数据,即用于标定的图片
  • 对每一张图片提取角点信息
  • 在棋盘上绘制提取到的角点(非必须,只是为了显示结果)
  • 利用提取的角点对相机进行标定
  • 获取相机的参数信息

2.关于相机校正用到的几个API:

  1. 寻找棋盘图中的棋盘角点
rect, corners = cv2.findChessboardCorners(image, pattern_size, flags)

参数:

  • Image: 输入的棋盘图,必须是8位的灰度或者彩色图像

  • Pattern_size:棋盘图中每行每列的角点个数(内角点)。

  • flags: 用来定义额外的滤波步骤以有助于寻找棋盘角点。所有的变量都可以单独或者以逻辑或的方式组合使用。取值主要有:

    CV_CALIB_CB_ADAPTIVE_THRESH :使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。

    CV_CALIB_CB_NORMALIZE_IMAGE :在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。

    CV_CALIB_CB_FILTER_QUADS :使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

返回:

  • Corners:检测到的角点
  • rect: 输出是否找到角点,找到角点返回1,否则返回0
  1. 检测完角点之后可以将测到的角点绘制在图像上,使用的API是:

    cv2.drawChessboardCorners(img, pattern_size, corners, rect)
    

    参数:

    • Img: 预绘制检测角点的图像
    • pattern_size : 预绘制的角点的形状
    • corners: 角点矩阵
    • rect: 表示是否所有的棋盘角点被找到,可以设置为findChessboardCorners的返回值

    注意:如果发现了所有的角点,那么角点将用不同颜色绘制(每行使用单独的颜色绘制),并且把角点以一定顺序用线连接起来。

  2. 利用定标的结果计算内外参数

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, image_size, None, None)

参数:

  • Object_points:世界坐标系中的点,在使用棋盘的场合,令z的坐标值为0,而x,y坐标用里面来度量,选用英寸单位,那么所有参数计算的结果也是用英寸表示。最简单的方式是定义棋盘的每一个方块为一个单位。
  • image_points:在图像中寻找到的角点的坐标,包含object_points所提供的所有点
  • image_size: 图像的大小,以像素为衡量单位

返回:

  • ret: 返回值

  • mtx: 相机的内参矩阵,大小为3*3的矩阵

  • dist: 畸变系数,为5*1大小的矢量

  • rvecs: 旋转变量

  • tvecs: 平移变量

2.1 图像去畸变

上一步中得到相机的内参及畸变系数,利用其进行图像的去畸变,最直接的方法就是调用opencv中的函数得到去畸变的图像:

def img_undistort(img, mtx, dist):dst = cv2.undistort(img, mtx, dist, None, mtx)return dst

求畸变的API:

dst = cv2.undistort(img, mtx, dist, None, mtx)

参数:

  • Img: 要进行校正的图像
  • mtx: 相机的内参
  • dist: 相机的畸变系数

返回:

  • dst: 图像校正后的结果

3. 相机校正

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import globdef plot_contrast_imgs(origin_img, converted_img, origin_img_title="origin_img", converted_img_title="converted_img", converted_img_gray=False):"""用于对比显示两幅图像"""fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 20))ax1.set_title(origin_img_title)ax1.imshow(origin_img)ax2.set_title(converted_img_title)if converted_img_gray==True:ax2.imshow(converted_img, cmap="gray")else:ax2.imshow(converted_img)plt.show()# 1. 参数设定:定义棋盘横向和纵向的角点个数并指定校正图像的位置
nx = 9
ny = 6
file_paths = glob.glob("./camera_cal/calibration*.jpg")
# 2. 计算相机的内外参数及畸变系数
def cal_calibrate_params(file_paths):object_points = []  # 三维空间中的点:3Dimage_points = []   # 图像空间中的点:2d# 2.1 生成真实的交点坐标:类似(0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)的三维点objp = np.zeros((nx * ny, 3), np.float32)objp[:, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2)# 2.2 检测每幅图像角点坐标for file_path in file_paths:img = cv2.imread(file_path)# 将图像转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 自动检测棋盘格内4个棋盘格的角点(2白2黑的交点)rect, corners = cv2.findChessboardCorners(gray, (nx, ny), None)# 若检测到角点,则将其存储到object_points和image_pointsif rect == True:object_points.append(objp)image_points.append(corners)# 2.3 获取相机参数ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)return ret, mtx, dist, rvecs, tvecsdef img_undistort(img, mtx, dist):"""图像去畸变"""return cv2.undistort(img, mtx, dist, None, mtx)# 测试去畸变函数的效果
file_paths = glob.glob("./camera_cal/calibration*.jpg")
ret, mtx, dist, rvecs, tvecs = cal_calibrate_params(file_paths)
if mtx.any() != None:  # a.any() or a.all()img = mpimg.imread("./camera_cal/calibration1.jpg")undistort_img = img_undistort(img, mtx, dist)plot_contrast_imgs(img, undistort_img)print("done!")
else:print("failed")

执行代码:

OpenCV 相机校正相关推荐

  1. OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析

    OpenCV 校正过程中,calibrateCamera函数的ret和重投影误差的分析 OpenCV对相机进行校正的过程中,校正返回值retval和重投影误差的计算公式表示和分析. OpenCV 校正 ...

  2. OpenCV相机标定与畸变校正

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自OpenCV学堂. OpenCV单目相机标定,图像畸变校正 相机标定定义与原理 01 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点 ...

  3. OpenCV畸变校正原理以及损失有效像素原理分析

    常用的张正友标定法的流程,其中获取了摄像机的内参矩阵K,和畸变系数D. 1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2; p1; p2[; k3[; k4; k5; k6]] ,其中 ...

  4. 相机校正与相机内参、外参

    简 介: 对于相机进行校正,是为之后视觉测量奠定基础.本文在总结了相机校正中的基本概念.使用cv2的函数说明校正的过程. 关键词: 相机校正,内参,外参 #mermaid-svg-0bogxxocrI ...

  5. opencv相机标定

    python 完整标注流程, python+opencv相机标定 - wenboz - 博客园 相机标定需要输出的参数: 焦距 像素或者物理单位mm 像素对应的物理长度 光心与物理senser中心的偏 ...

  6. 智慧交通day03-车道线检测实现03:相机校正和图像校正的实现

    1.相机标定 根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数. 标定的流程是: 准备棋盘格数据,即用于标定的图片 对每一张图片提取角点信息 在棋盘上绘制提 ...

  7. OpenCV4每日一练day13:双目相机校正

    一.双目相机校正说明--<OpenCV4快速入门> 二.双目相机校正 文件准备: 运行结果: 附代码: #include <opencv2\opencv.hpp> #inclu ...

  8. OpenCV透视校正perspective correction的实例(附完整代码)

    OpenCV透视校正perspective correction的实例 OpenCV透视校正perspective correction的实例 OpenCV透视校正perspective correc ...

  9. OpenCV相机位移引起的单应性的实例(附完整代码)

    OpenCV相机位移引起的单应性的实例 OpenCV相机位移引起的单应性的实例 OpenCV相机位移引起的单应性的实例 #include <iostream> #include <o ...

最新文章

  1. 让你的输入框使用Google云语音输入技术
  2. 数十篇推荐系统论文被批无法复现:源码、数据集均缺失,性能难达预期
  3. python家的杨辉三角
  4. 《Python Cookbook 3rd》笔记(2.11):删除字符串中不需要的字符
  5. 抢红包概率是随机的吗_顺丰发5亿红包给员工:管理学的随机奖励还能这么玩...
  6. 网页性能优化{雅虎[转载]}
  7. Java String trim()方法示例
  8. iOS底层探索之多线程(七)—GCD源码分析(死锁的原因)
  9. q萌扫地机器人_为什么买了扫地机器人的到最后都后悔了?
  10. 谷歌地图网页版_安卓版谷歌地图新增专用的街景图层
  11. 把握这两点,抢占下一个电商风口|2016最新中国电商App排名研究报告
  12. react-redux中Connect方法
  13. 【编程题】【Scratch四级】2021.03 程序优化
  14. 【从零开始学习Oracle数据库】(3)函数与子查询和连接查询
  15. JS — 声明与引入
  16. 登录+注册界面的实现(代码)
  17. java制作vpk系统_FWReinstaller3.60重刷系统VPK分享
  18. 基于三维GIS技术的智慧物流园区建设
  19. 基于JAVA毕业生就业管理系统计算机毕业设计源码+系统+lw文档+部署
  20. 1如何用P6做双代号网络图

热门文章

  1. 安装Kubernetes-Dashboard插件
  2. 7 款从 HTML 文档提取文本的工具
  3. 算法练习——ACM_1001_Exponentiation
  4. Android常见控件— — —EditText
  5. 【Shell】fix 1032报错信息的脚本
  6. 网易有道的产品总监王焱:如何利用数据分析推动产品设计
  7. StringBuffer的用法
  8. javascript向表中添加行--浏览器兼容性问题
  9. 细数网站成功赢利须具备的四大核心要素
  10. C#正则表达式整理备忘