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()
效果如下
标定
函数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]]
这些畸变参数的物理意义如下
来源:https://blog.csdn.net/m0_37816922/article/details/130621684
标签:OpenCV,相机,标定
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
大家都来设计创意XP黑屏!
2008-10-25 14:59:00
![](https://img.aspxhome.com/file/UploadPic/up/2008102515100367.gif)
python 执行shell命令并将结果保存的实例
2023-07-27 20:34:52
[翻译]标记语言和样式手册 Chapter 8 再谈清单
2008-01-29 13:16:00
![](https://img.aspxhome.com/file/UploadPic/20081/29/2008129133019614s.jpg)
关于document.createDocumentFragment()
2009-04-05 16:04:00
Python代码覆盖率统计工具coverage.py用法详解
2021-02-02 22:55:51
如何在Unix系统环境下安装MySQL数据库
2009-01-04 13:09:00
使用xml http为网站增加域名查询功能
2008-05-29 13:42:00
Javascript优化五大原则
2007-10-30 13:49:00
详解Python中表达式i += x与i = i + x是否等价
2023-07-29 06:51:12
![](https://img.aspxhome.com/file/2023/4/78634_0s.png)
python批量下载网站马拉松照片的完整步骤
2023-08-31 19:00:27
![](https://img.aspxhome.com/file/2023/5/64985_0s.jpg)
python十进制转二进制的详解
2023-06-07 23:39:33
HTML与javascript中常用编码浅析
2008-12-23 12:20:00
python函数装饰器构造和参数传递
2023-05-24 16:49:17
Python使用Selenium实现淘宝抢单的流程分析
2022-01-31 04:04:18
![](https://img.aspxhome.com/file/2023/4/68894_0s.png)
pyhton学习与数据挖掘self原理及应用分析
2023-07-04 23:19:11
Django 浅谈根据配置生成SQL语句的问题
2023-05-10 07:48:23
PHP 修改SESSION的生存时间案例详解
2023-06-11 19:44:20
![](https://img.aspxhome.com/file/2023/0/55540_0s.png)
Python实现对照片中的人脸进行颜值预测
2023-04-05 18:21:12
![](https://img.aspxhome.com/file/2023/2/80732_0s.png)
Golang三个编译基本命令的使用小结
2023-08-28 05:08:03
![](https://img.aspxhome.com/file/2023/1/101691_0s.png)
Python基础之元编程知识总结
2023-03-17 11:06:36