Python+OpenCV实现相机标定的方法详解
作者:微小冷 发布时间:2021-03-10 20:02:30
标签: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]]
这些畸变参数的物理意义如下
来源:https://blog.csdn.net/m0_37816922/article/details/130621684


猜你喜欢
- 需求:统计列表list1中元素3的个数,并返回每个元素的索引list1 = [3, 3, 8, 9, 2, 10, 6, 2, 8, 3,
- 做数据分析、科学计算等离不开工具、语言的使用,目前最流行的数据语言,无非是MATLAB,R语言,Python这三种语言,但今天小编简单总结了
- 前言A货:什么!你不会背圆周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 桥哥:我会算呀 !
- 可以使用Python的email模块来实现带有附件的邮件的发送。SMTP (Simple Mail Transfer Protocol)邮件
- 今天实现一个进度条加载过程,dom结构其实就是两个div<div class="pbar"> <div
- 1.前言在 Python 中,说到函数,大家都很容易想到用 def 关键字来声明一个函数:def Hello():
- MySQL多表查询添加练习表-- 用户表(user)CREATE TABLE `user`(`id` INT AUTO_INCREMENT
- PS: 传送门——自定义Colorbars教程自定义colorbar(draw colorbar w
- kali中angr的安装方式在Linux中安装各种依赖python的软件时,最头疼的问题之一就是各个软件的python版本不匹配的问题,an
- 前言随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了windows下YOLO的环境搭建流程。一
- 一、日志输出到文件使用模块:logging可以生成自定义等级日志,可以输出日志到指定路径日志等级:debug(调试日志) < info
- 下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。案例一:案例二:案例三:很好理解, 对吧?说明:这些行为是由于 Cpython
- 每种编程语言都会有一些特殊的单词,称为关键词。对待关键词的基本要求是,你在命名的时候要避免与之重复。本文将介绍一下Python中的关键词。关
- 创建云函数目录首先,我们需要在uni-app项目文件夹下,创建一个云函数目录,路径随意,我这里是functions。然后先随便在里面放一些文
- 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况。但是在p
- 目录项目场景:解决方案:概要描述:详细说明:总结:项目场景:使用FreeSql,包含所有的ORM数据库,都会存在这样的问题。在codefir
- 一、UDP编程1.客户端Client:发起访问的一方。2.服务器端3.server段编程(1)建立socket,socket是负责具体通信的
- 我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音,笔画等。基本思路很简单:用相邻像素替换那些坏标记,使其看起来像邻域。cv2.inp
- 列表:list=[val1,val2]1.列表中的每一个元素都是可变的,有序的,可以被查看索引的。可变意味着可以对每个元素进行增删改查的操作
- 描述Bootstrap Button(按钮)JavaScript 插件允许您加强按钮的功能。您可以控制按钮的状态,也可以为组件创建按钮组,比