解决 calibration.cpp:3408: error: (-210:Unsupported format or combination of formats)

本文主要是介绍解决 calibration.cpp:3408: error: (-210:Unsupported format or combination of formats),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、完整报错

报错代码如下:

ret, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(cal_img.object_points, cal_img.corners, img_size,None, None)          
cv2.error: OpenCV(4.8.0) /io/opencv/modules/calib3d/src/calibration.cpp:3408: error: (-210:Unsupported format or combination of formats) objectPoints should contain vector of vectors of points of type Point3f in function 'collectCalibrationData'

官方API对参数的描述,点我进入OpenCV库cv2.calibrateCamera的API。

calibrateCamera	(	
InputArrayOfArrays 	objectPoints,
InputArrayOfArrays 	imagePoints,
Size 	imageSize,
InputOutputArray 	cameraMatrix,
InputOutputArray 	distCoeffs,
OutputArrayOfArrays 	rvecs,
OutputArrayOfArrays 	tvecs,
int 	flags = 0,
TermCriteria 	criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) 
)	

 参数调试截图(错误代码行):
cv2.calibrateCamera函数 cal_img.object_points, cal_img.corners,均是np类型数组,如下图1所示:
在这里插入图片描述

图1 错误的输入

 实际上,cv2.calibrateCamera函数需要多张输入图片,读取成list或者np类型,该类型中每一个存储都是np类型,且objectPoints必须是整数,如下图2所示,读者可以好好比对一下。

在这里插入图片描述
在这里插入图片描述

图2 两种正确的输入

2、报错原因

  在做相机标定时候,我采用了OpenCV库中的cv2.calibrateCamera来标定内参,但是因为对相机标定没那么熟悉,想着把标定板的坐标[[0, 0, 0], [1, 0, 0], [2, 0, 0], ...] 直接加上实际标定板距离世界坐标系原点的相对位置坐标[x, y, z],标定板的黑色正方形边长d,就把标定板的坐标变成了[[0+x+d, y, 0+z], [0+x+2d, y, 0+z], [0+x+3d, y, 0+z], ...],妄想一步就求出外参,实则用错函数,我也不知道读者是不是跟我一样的思想,我只是一个小白,这是学习中踩下的坑。 话不多说,直接说解决方案。

3、解决方案

3.1 求内参

  注意看上图2即可,objectPointsimagePoints 必须是list或者np类型,列表中包含多张图片数据(np类型)。且objectPoints中的每个点必须是整数,如上图2所示,读者可以好好比对一下。
  这样修改可以使得代码不报错,但是没求出来的内外参没有那么准确,因为您只用了一张图片来求,我无非是帮你生维度了,建议读入多张图片。

ret, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(np.expand_dims(objectPoints, axis=0), np.expand_dims(imagePoints, axis=0), img_size,None, None) 

3.2 求外参

  如果读者是只有一张图片,读取的变量如图一所示,那么什么也不需要改,将你的变量直接放入下列函数中,但需要相机内参与畸变矩阵已知!!!

 _, rvecs, tvecs = cv2.solvePnP(object_points, corners, self.cameraMatrix, self.distCoeffs)

4、更为简单的方法

4.1 拉取代码

  拉取我写的标定代码,把cfg.yml中的文件地址改为自己的地址即可,我也上传了一些图片,用于跑代码,作者可以仿照着给图片。【点我进入GitHub代码】

git clone https://github.com/Wei-JL/camera_calibration.git

cfg.yml文件如下:

CameraID: 1 # 该属性没有用到
CamerName: HSCamera1 # 该属性没有用到
ImageSize: [640, 480]
Pattern: "INVAILD_STRING" # 该属性没有用到
BoardSize: [13, 9] # 标定板的角点13 x 9
FrameNum: 30 # 该数字没有用到,尽可能大于30张用于求内参和畸变矩阵
SquareSize: 0.018 # 标定板的黑色正方形的边长,单位M
DistanceFromOrigin: [0.555, 0.55, 0.96] # X-Y-Z 右手坐标系,单位M, y轴向前
DemarcateEdgeDistance: [0.021, 0.012] #标定板一端的多余留白的宽,以及多余留白的长SaveIMGPath: [False, "./out_draw_img/"]
# 求内参所用的图片文件夹路径
InternalImgPath: "./imgData/InternalParametersIMG/"
# 求外参所用的图片文件夹路径
ExternalImgPath: "./imgData/ExternalParametersIMG/"
# 保存生成的内外参
SaveYMLPath: "./ymlResult/CameraPropertiesYML.yml"

直接运行main.py,得到 ymlResult/CameraPropertiesYML.yml内容如下:

%YAML:1.0
---
cameraMatrix: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 5.8872269401549318e+02, 0., 3.1396526288061324e+02, 0.,5.8916193444451278e+02, 2.3596852375684645e+02, 0., 0., 1. ]
distCoeffs: !!opencv-matrixrows: 1cols: 5dt: ddata: [ 2.3846216967883582e-02, 3.1566029814152891e-01,-3.4342893273889208e-03, -3.9197758689113425e-03,-1.2329393625222367e+00 ]
external_rot_index0: !!opencv-matrixrows: 3cols: 1dt: ddata: [ -5.0544041998692286e-02, 9.4373234595587441e-02,-2.3742117741779416e-02 ]
external_tra_index0: !!opencv-matrixrows: 3cols: 1dt: ddata: [ -1.2322397186032250e+01, 1.7099433969274160e+00,3.0594561071329622e+01 ]
external_rot_index1: !!opencv-matrixrows: 3cols: 1dt: ddata: [ -5.0544053387929486e-02, 9.4373100695407761e-02,-2.3742107968675215e-02 ]
external_tra_index1: !!opencv-matrixrows: 3cols: 1dt: ddata: [ -1.2322397408243795e+01, 1.7099434779488030e+00,3.0594561991082113e+01 ]

4.2 成功运行截图

在这里插入图片描述

这篇关于解决 calibration.cpp:3408: error: (-210:Unsupported format or combination of formats)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/428140

相关文章

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

MAVEN3.9.x中301问题及解决方法

《MAVEN3.9.x中301问题及解决方法》本文主要介绍了使用MAVEN3.9.x中301问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录01、背景02、现象03、分析原因04、解决方案及验证05、结语本文主要是针对“构建加速”需求交

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc