分别使用Matlab和OpenCV标定微距相机

2024-01-31 03:40

本文主要是介绍分别使用Matlab和OpenCV标定微距相机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

软件:
Matlab 2014a,VS 2013

棋盘格标定板:
方格边长0.5mm,横向角点数19个,纵向角点数15个。

相机内参估算

其实在已知相机的某些参数后,不进行标定也可以估计出大致的内参矩阵。

根据上一篇博文中对图像坐标系、相机坐标系和世界坐标系的学习,可以知道相机内参的形式:

        fx   0   u0K =   0  fy   v00   0    1

内参数为fx,fy,u0,v0。其中:fx=f/dx, fy=f/dy;u0,v0为主点坐标。

理想情况下:fx=fy;u0,v0分别为分辨率的一半,所以在已知焦距、图像分辨率和传感器尺寸等参数后,可以对理想情况下的内参进行估算。

以网上经常作为举例对象的NiKon D700相机为例:

焦距 f=35mm,最高分辨率 42562832,传感器尺寸 36.0mm23.9mm

则可计算出:

dx=36.0/4256,dy=23.9/2832 —> fx=f/dx=4137.8,fy=f/dy=4147.3

u0=4256/2=2128,v0=2832/2=1416

内参矩阵即为:

         4137.8     0       2128K =     0     4147.3    14160       0         1

但在对精度要求比较高的场合还是需要对相机进行标定,得到相机实际的内参和畸变参数。

Matlab标定工具箱

参考博客:http://blog.csdn.net/jameshater/article/details/53172333

该博客中工具箱各功能的使用介绍得十分详细,适合小白入门参考和需要复杂功能时的查阅。

由于我前期只需要简单标定得到内参,所以只进行最主要的三个步骤:读入图片,提取角点和相机标定。

过程记录如下:

1.标定工具箱的下载安装:

可按照参考博客中的网址下载。

下载后解压到matlab的工作路径,在命令窗口使用calib_gui打开。

2.读入图片

选择Standard(all the images are stored in memory)。

这里写图片描述

选择image names(在此之前需要将文件夹选为存放标定图片的那个)。

这里写图片描述

输入图片基名Basename(假如图片的存储名称为img1.jpg,则基名为数字前的img。我电脑中存储的直接为1.jpg,2.jpg…,所以此处直接键入回车)。

这里写图片描述

输入图片格式(根据自己图片存储情况和提示输入即可,我的是jpg格式,所以输入j)。

这里写图片描述

之后程序自动读取该文件夹下的图片并显示。

这里写图片描述

3.提取角点

选择Extract grid corners。

这里写图片描述

选择是否处理所有图片,可以输入图片索引,如[1,2,3],默认则处理第一步读取进的全部图片,无特殊需求则此处选择回车默认。

这里写图片描述

选择提取角点的窗口尺寸和是否自动提取,此处均回车默认即可。

这里写图片描述

显示第一张标定图片,手动选择四个边缘角点,一般按照:左上,右上,右下,左下的顺序。

这里写图片描述
这里写图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2m6neV2-1572752004434)(https://img-blog.csdn.net/20170811131103781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQWlsZWVuTnV0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
这里写图片描述

选择了四个角点后,需要输入x方向和y方向上的棋盘格小方格边长,我这里的dx=dy=0.5mm,故输入0.5。

这里写图片描述

显示提取角点后的图片,选择是否需要猜测畸变参数。根据角点提取效果自行选择,一般提取效果都很好,可以直接默认回车不猜测畸变;如果提取效果不理想,畸变较大,可以试凑查看效果,一般该参数在-1和1之间。

这里写图片描述

这里写图片描述

不断循环该过程直至所有图片的角点提取完毕。

这里写图片描述

4.相机标定

选择Calibration,即可得到标定结果。

这里写图片描述

选择Save,保存标定结果,文件名为Calib_Results.m。

这里写图片描述

OpenCV自带标定程序

参考博客:http://blog.csdn.net/t247555529/article/details/47836233#comments

1.新建工程demo,配置OpenCV环境。

2.生成标定时读取图片所需的yaml图片列表。

(1)添加源文件imagelist_creator.cpp,编译执行,在Debug文件夹中得到demo.exe。

(2)进入cmd,cd进入工程路径下的Dubug文件夹。
输入命令:demo imagelist.yaml 图片名
其中图片名是标定过程中使用的所有图片的名字,以我自己为例,此处键入1.jpg 2.jpg 3.jpg …

3.相机标定

(1)删除工程下的源文件imagelist_creator.cpp,添加calibration.cpp,编译执行,在Debug文件夹中得到demo.exe。

(2)将标定使用的图片放在Debug文件夹下。

(3)进入cmd,cd进入工程路径下的Debug文件夹。
输入命令: demo -w 19 -h 15 -s 0.5 imagelist.yaml
其中:-w为每行的角点个数,-h为每列的角点个数,-s为棋盘格的方格边长,单位为mm。

(4)标定结果会保存在Debug文件夹下的out_camera_data.yml中,此类文件可以使用Notepad++打开。

二者对比

1.Matlab标定工具箱

需要指定小方格的长宽(单位mm),并手动提取每张标定图的四个边角点,比较麻烦,但角点提取和标定效果较好。

这里写图片描述

2.OpenCV自带标定程序

需要指定小方格的边长(单位mm),行和列的角点数,自动提取,比较方便,但角点提取和标定效果有时不如人意。
可能比较适用于OpenCV示例中大且方格数量少的棋盘格标定板,对于我使用的0.5mm且方格数量较多的微距标定板效果很不理想。

这里写图片描述

3.其他OpenCV标定程序

在OpenCV官方自带标定程序标定失败后,也找了很多网上其他OpenCV标定程序。其在角点提取和处理上会比自带程序好很多,不会如此混乱。但在我将棋盘格小方格参数修改为标定板参数0.5mm后,会出现矩阵和参数无法计算,均为无效点1.#QNAN的情况。

根据目前标定的效果,虽然Matlab半自动有点麻烦,但我还是决定使用Matlab标定工具箱了…

最后,关于使用OpenCV标定的情况,如果有更好更精确的方法,或者能解决文中的问题,还望各位大牛不吝赐教,谢谢!

这篇关于分别使用Matlab和OpenCV标定微距相机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/AileenNut/article/details/77097200
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/662442

相关文章

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx