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
0
投稿
猜你喜欢
- 恭喜您,您中奖了,你的中奖码是(请牢记,领奖需要):XXXXXXXXXXX然后用户输入XXXXXXXXXXX,简单验证后就可以领奖了。你使用
- 目前网上能获取的免费的python打包工具主要有三种:py2exe、PyInstaller和cx_Freeze。下面简单介绍windows7
- 对于某一类网站, 管理界面 是基础设施中非常重要的一部分。 这是以网页和有限的可信任管理者为基础的界面,它可以让你添加,编辑和删除网站内容。
- 1.func Fields(s string) []string,这个函数的作用是按照1:n个空格来分割字符串最后返回的是[]string的
- 使用方法:terminal中输入python weather.py http://www.weather.com.cn/weather/10
- 说明Django 默认的用户表 auth_user 包含 id, password, last_login, is_superuser, u
- 有时候在使用 Python 的时候,想要对一个数字或者字符串进行补零操作,即把「1」变为一个八位数的「00000001」,这个时候可以使用一
- csv的简单介绍CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用
- 网络上有很多个性化的404页面,但是404页面不仅仅是个性化展示,404页面本来目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用
- Nextcloud 是一款自由 (开源) 的类 Dropbox 软件,由 ownCloud 分支演化形成。它使用 PHP 和 JavaScr
- 一、this1.什么是thisthis 关键字在大部分语言中都是一个重要的存在,JS中自然不例外,其表达的意义丰富多样甚至有些复杂,深刻理解
- 设法让用户happy吧~只要你的设计让用户乐了,产品的个性就得到了一次彰显,而用户对网站的情感就会获得一次升华,看看下面的知名网站的人性化设
- 用python写了一个简单版本的textrank,实现提取关键词的功能。import numpy as np import jieba im
- selenium关闭窗口有两个方法,close与quit,我们稍作研究便知道这两个方法的区别。1.看源码或API这是close()的说明:C
- 本文介绍在Anaconda环境下,安装Python中栅格、矢量等地理数据处理库GDAL的方法。需要注意的是,本文介绍基于conda inst
- 我们常常看到一个这样的表达式 A=lambda x:x+1可能会一头雾水不知道怎么计算 最基本的理解就是def A(x):retu
- 1、HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Applicatio
- 前言最近在python里面用json读取json文件,可是老是不成功,特此记录一下。预备知识:def load(fp, cls=None,
- 今天看到的这篇文章, 让我对Chrome能够带来的影响,有了点新想法。Update: 发现我在跟别人讨论时,比直接写作文说得清楚一些,对这个
- logging模块简介Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并