Python+OpenCV实现相机标定的方法详解

 更新时间:2023年05月17日 11:32:18   作者:微小冷  
opencv中内置了张正友的棋盘格标定法,通过一些姿态各异的棋盘格图像,可以标定相机的内外参数,本文为大家介绍OpenCV进行相机标定的具体方法,希望对大家有所帮助

opencv中内置了张正友的棋盘格标定法,通过一些姿态各异的棋盘格图像,就能标定相机的内外参数。

角点检测

第一步是角点检测,首先需要读取棋盘格图像

import numpy as np
import cv2
import os

path = 'imgs'   # 图像文件夹;相对路径
fs = os.listdir(path)
grays = []
for f in fs:
    fName = os.path.join(path, f)
    img = cv2.imread(fName)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图像转灰度
    grays.append(gray)

其中,grays中便是所有棋盘格灰度图像,接下来,就要找到这些棋盘格的角点位置,主要用到函数findChessboardCorners,其输入参数为棋盘格图像、角点个数以及标志位。

w, h = 11, 8        # 交点横纵个数

# 亚像素点的检测条件
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
pImgs = []
for g in grays: 
   # cs即位初步检测的角点
   ret, cs = cv2.findChessboardCorners(g, (w, h), None) 
   # 亚像素角点检测
   pImg = cv2.cornerSubPix(g, cs.astype(np.float32), (5, 5), (-1,   -1), criteria)
   pImgs.append(np.squeeze(pImg))

其中,pImg用于存放像素坐标中的二维点。

查看角点

为了验证角点检测是否合理,可以将其画出来,用opencv自带的工具就像下面这样就可以,

cv2.drawChessboardCorners(grays[0], (w, h), pImgs[0], None)
cv2.imshow('findCorners', grays[0])
cv2.waitKey(1000)

但窗口缩放比较麻烦,所以更推荐用经典的matplotlib来画图

import matplotlib.pyplot as plt
pts = pImgs[0].squeeze().reshape(-1,2).T
plt.imshow(grays[0])
plt.scatter(pts[0], pts[1], marker='*', c='red')
plt.show()

效果如下

标定

函数calibrateCamera可用于图像标定,只需将现实世界的点和相机坐标系中的角点的一一对应关系输入,便能得到相应的相机矩阵。其中,现实世界中哦的三维点,一般成为对象点,由于棋盘格中每个方块都是等距的,故可直接建立为类似(1,0,0), (2,0,0)...即可

objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

pObj = np.zeros((w*h, 3), np.float32)
pObj[:,:2] = np.mgrid[0:w, 0:h].T.reshape(-1,2)
pObjs = [pObj for _ in range(len(pImgs))]

至此,万事俱备,只需调用

size = grays[0].shape[::-1]     # 图像尺寸
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(pObjs, pImgs, size, None, None)

其中,rec为成功标志,为True时表示标定成功。

mtx为内参矩阵,差不多是

dist为畸变参数,最多有8个,分别表示k1,k2,p1,p2,k3,k4,k5,k6,本次标定得到的结果为

>>> print(dist)
[[-8.36577030e-02 -1.68977185e-01 -1.12233478e-03  9.45685802e-04
  -2.04246147e+01]]

这些畸变参数的物理意义如下

以上就是Python+OpenCV实现相机标定的方法详解的详细内容,更多关于Python OpenCV相机标定的资料请关注脚本之家其它相关文章!

相关文章

  • Python集合操作方法详解

    Python集合操作方法详解

    这篇文章主要介绍了Python集合操作方法详解,需要的朋友可以参考下
    2020-02-02
  • 详解Django中Request对象的相关用法

    详解Django中Request对象的相关用法

    这篇文章主要介绍了详解Django中Request对象的相关用法,Django是Python重多人气框架中最著名的一个,需要的朋友可以参考下
    2015-07-07
  • Python自定义sorted排序实现方法详解

    Python自定义sorted排序实现方法详解

    这篇文章主要介绍了Python自定义sorted排序实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 在python 不同时区之间的差值与转换方法

    在python 不同时区之间的差值与转换方法

    今天小编就为大家分享一篇在python 不同时区之间的差值与转换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python代码操作Excel条件格式的实战指南

    Python代码操作Excel条件格式的实战指南

    用代码操作Excel条件格式,本质上就是把你手动点鼠标的步骤写成脚本,数据更新了,脚本跑一遍,格式自动生成,下面我们就来看看具体的实现方法吧
    2026-03-03
  • python算法测试结果自动保存到excel表格的实现步骤

    python算法测试结果自动保存到excel表格的实现步骤

    我们在进行算法评估是通常会针对每个样本的算法处理结果进行统计,例如每个样本正确预测数量、漏检数量和误检数量、精度等,本文小编将给大家介绍python算法测试结果自动保存到excel表格的实现步骤,感兴趣的朋友可以参考下
    2023-12-12
  • Python系统公网私网流量监控实现流程

    Python系统公网私网流量监控实现流程

    这篇文章主要介绍了Python系统公网私网流量监控实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 详解KMP算法以及python如何实现

    详解KMP算法以及python如何实现

    这篇文章主要介绍了KMP算法的相关知识以及python如何实现,帮助大家更好的进行数据分析,感兴趣的朋友可以了解下
    2020-09-09
  • Python如何筛选序列中的元素的方法实现

    Python如何筛选序列中的元素的方法实现

    这篇文章主要介绍了Python如何筛选序列中的元素的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 手把手教你如何使python变为可执行文件

    手把手教你如何使python变为可执行文件

    对于exe可执行文件,相信大家都不陌生,下面这篇文章主要给大家介绍了关于如何使python变为可执行文件的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论