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

作者:微小冷 时间:2021-03-10 20:02:30 

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()

效果如下

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

标定

函数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为内参矩阵,差不多是

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

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实现相机标定的方法详解

来源:https://blog.csdn.net/m0_37816922/article/details/130621684

标签:OpenCV,相机,标定
0
投稿

猜你喜欢

  • Python基础中的的if-else语句详解

    2023-03-14 16:05:23
  • vue element table 表格请求后台排序的方法

    2024-05-29 22:49:37
  • 简述mysql监控组复制

    2024-01-22 03:48:55
  • 在Go语言中使用JSON的方法

    2024-04-25 15:26:04
  • Vue Render函数原理及代码实例解析

    2023-07-02 16:34:38
  • Keras之fit_generator与train_on_batch用法

    2021-07-10 18:19:31
  • python接口自动化之ConfigParser配置文件的使用详解

    2023-09-07 02:56:04
  • python实现多线程抓取知乎用户

    2021-10-05 16:56:07
  • 原生js实现五子棋游戏

    2024-06-18 03:22:13
  • PHP截取指定图片大小的方法

    2023-09-11 13:20:21
  • Go语言依赖管理三要素示例解析

    2024-05-05 09:32:34
  • CI框架整合smarty步骤详解

    2023-11-14 11:18:11
  • Python列表推导式、字典推导式与集合推导式用法实例分析

    2022-04-10 10:34:00
  • python多线程抓取天涯帖子内容示例

    2021-03-18 11:56:42
  • 解析python中的jsonpath 提取器

    2021-11-18 23:06:04
  • 这种sql写法真的会导致索引失效吗

    2024-01-18 18:31:47
  • python实现zencart产品数据导入到magento(python导入数据)

    2022-06-04 12:34:32
  • vue-property-decorator用法详解

    2024-05-29 22:49:55
  • Python基于xlrd模块操作Excel的方法示例

    2021-07-18 16:04:06
  • Python CSS选择器爬取京东网商品信息过程解析

    2022-01-17 21:18:17
  • asp之家 网络编程 m.aspxhome.com