opencv-python相机标定详解

news2024/11/23 17:06:28

文章目录

    • 角点检测
    • 查看角点
    • 标定

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

[ f x 0 c x 0 f y c y 0 0 1 ] = [ 5572.47 0 1314.18 0 5573.04 1008.16 0 0 1 ] \begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix} =\begin{bmatrix} 5572.47&0&1314.18\\0&5573.04&1008.16\\0&0&1 \end{bmatrix} fx000fy0cxcy1 = 5572.470005573.0401314.181008.161

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]]

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

x ′ = x z , y ′ = y z , r = x ′ 2 + y ′ 2 K = 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 1 + k 4 r 2 + k 5 r 4 + k 6 r 6 x ′ ′ = K x ′ + 2 p 1 x ′ y ′ + p 2 ( r 2 + 2 x ′ 2 ) u = f x x ′ ′ + c x v = f y y ′ ′ + c y \begin{aligned} x'&=\frac{x}{z},\quad y'=\frac{y}{z},\quad r=\sqrt{x'^2+y'^2}\\ K& = \frac{1+k_1r^2+k2_r^4+k_3r^6}{1+k_4r^2+k_5r^4+k_6r^6}\\ x'' &= Kx'+2p_1x'y'+p_2(r^2+2x'^2)\\ u&=f_xx''+c_x\\ v&=f_yy''+c_y\\ \end{aligned} xKx′′uv=zx,y=zy,r=x′2+y′2 =1+k4r2+k5r4+k6r61+k1r2+k2r4+k3r6=Kx+2p1xy+p2(r2+2x′2)=fxx′′+cx=fyy′′+cy

rvecstvecs分别表示每个标定板对应的旋转和平移向量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种Android应用的桌面图标隐藏方法

在Android10之前,应用程序通过调用PackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)函数来实现图标隐藏。 但是在android10之后,所有带四大组件&#xff08…

RabbitMQ养成记 (6. spingboot 集成 rabbitMQ,生产者/消费者)

Springboot集成 搞springboot的那群人 不喜欢造轮子,就喜欢搞各种集成。 首先创建一个springboot项目: 之前我们在方法中 创建工厂类配置, 现在直接在application.yml 中配置即可: spring:rabbitmq:host: **********username:…

赢得浮生半日闲,内卷时代,我们需要怎样的智能科技?

哲学家罗泰戈拉说:“人是万物的尺度,是存在的事物存在的尺度。” 智能电器,究竟能为用户和市场提供什么样的价值?凭什么让消费者买单?毫无疑问,也应该以“人”为标尺。 今天,忙碌似乎成了现代人…

特征选择与特征提取

目录 一、 特征选择1、特征2、特征选择3、扩展——特征选择算法(有兴趣和精力可了解)拓展--完全搜索:拓展--启发式搜索:拓展--随机搜索:拓展--遗传算法: 二、 特征提取三、特征提取主要方法——PCA(主成分分析)1、PCA算法是如何实现的?PCA--零均值化(中心…

Redis 概述

1. NoSQL 数据库简介 技术发展: 技术的分类 1、解决功能性的问题: Java、 Jsp、 RDBMS、 Tomcat、 HTML、 Linux、 JDBC、 SVN2、解决扩展性的问题: Struts、 Spring、 SpringMVC、 Hibernate、 Mybatis3、解决性能的问题: NoSQL、 Java 线…

从神经递质到网络:利用分子信息功能成像超越组织层级

导读 人脑在微观、介观和宏观尺度的组织原则上表现出复杂的相互作用。最近的协同多模态方法已经开始将微观尺度信息与系统水平的动力学联系起来,超越了组织层级,并为大脑的功能和功能障碍提供了新的视角。具体来说,可以将微观尺度特性&#…

HMI 自动生成技术讨论(1)

HMI 的信息模型 HMI 给人的基本印象就是一个设备控制面板,或者是控制室里电脑屏幕的图形控制界面。进入信息化时代,HMI 的需求越来越大,不仅仅是操作工人和运维人员需要HMI,集团公司,工厂,车间的管理人员&…

芯片封装技术(四)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作,封装对芯片来说是必不可少的,随着IC生产技术的进步,封装技术也不断更新换代,每一代IC都与新一代的IC封装技术紧密相连。 一、什么是封装&#xf…

Qt文件系统源码分析—第二篇QFileInfo

深度 本文主要分析Windows平台,Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次,再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化

目录 1 主要内容 2 部分程序 3 程序结果 4 程序链接 1 主要内容 “双碳”背景下,为提高能源利用率,优化设备的运行灵活性,进一步降低综合能源系统(IES)的碳排放水平,提出一种IES低碳经济运行策略。首先…

【牛客刷题】笔试选择题整理(day1-day2)

每天都在进步呀 文章目录 1. 小数求模运算2. 进程的分区,这里说的不是JVM的分区。进程中,方法存放在方法区。3. 访问权限控制4. 继承与多态5. 与equals()6. 类加载顺序7. super()与this()7.1 super7.1.1 super调用父类构造方法7.1.2 super调用父类属性和…

Jabil EDI项目开源介绍

近期为了帮助广大用户更好地使用EDI系统,我们根据以往的项目实施经验,将成熟的EDI项目进行开源。用户安装好知行之桥EDI系统之后,只需要下载我们整理好的示例代码,并放置在知行之桥指定的工作区中,即可开始使用。 今天…

低代码工具库IRenderer『即可体验』上线了

在经历一段时间的折腾后,IRenderer迎来了一次版本更新,除了修复若干bug、优化编辑器性能外,在官网也添加了playground『即刻体验』入口。让您可以在线感受IRenderer可以提供的便利。 官网(github.io打开速度较慢,请稍等忍耐)地址…

SpringBoot——配置文件的分类

简单介绍: 在之前我们写配置文件的时候,我们直接在项目中的resources下面编写的配置文件,其实除了在这个路径下编写配置文件,还可以在其他的地方编写配置文件,并且不同位置的配置文件在启动的时候的优先级也是不一样的…

Srping注解之@Async:SpringBoot 实现异步调用

目录 1:前言 2:如何创建线程池 3:自定义线程池 1:前言 在日常开发过程中,会遇到一些需求是和主业务逻辑低耦合的,不要求和主业务逻辑同步进行,比如记录日志信息、发送消息通知电子邮件、生成…

Elasticsearch:使用 count API 来获得所有文档的个数

在我开始使用 Elasticsearch 的时候,我希望获得给定查询的文档总数。比如我们想对数据进行分页显示。从 Elasticsearch 7.0之后,为了提高搜索的性能,在 hits 字段中返回的文档数有时不是最精确的数值。Elasticsearch 限制了最多的数值为10000…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(一)

MyEclipse v2022.1.0正式版下载 如果您有HTML或JSP文件要编辑,这里将介绍如何编辑。查找以下信息: 编辑源代码大纲和属性视图参数页面 该功能在MyEclipse中是可用的。 一、HTML / JSP编辑器 要编辑HTML或JSP文件,请执行以下操作当中的一…

IPWorks BLE 2022 .NET Edition 22.0.8 Crack

IPWorks BLE 2022 .NET是一个蓝牙低功耗组件库,提供对 BLE 操作的直接访问。IPWorks BLE 组件提供简单的服务发现和对支持 BLE 的设备的访问。 蓝牙库 低功耗蓝牙组件 IPWorks BLE 包括一组功能强大的组件,用于将低功耗蓝牙通信功能集成到 Web、桌面和移…

Liunx 套接字编程(1)UDP协议的操作且实现一个UDP通信客户端

1.套接字编程 主要讲解的就是如何编写一个网络通信程序 1.网络通信的数据中都会包含一个完整的五元组: sip,sport,dip,dport,protocol(源端IP,源端端口,对端IP,对端端口,协议) 五元组完整的描述了数据从哪来,到哪去&am…

平抑风电波动的电-氢混合储能容量优化配置(matlab代码)

目录 1 主要内容 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序部分复现电机文章《平抑风电波动的电-氢混合储能容量优化配置》,针对电-氢混合系统协同平抑接入新型电力系统的新能源波动问题,提出考虑碱性电解槽运行特性的电-氢混合储能容量…