【OpenCV/aruco】校准相机(Camera Calibration) Demo

本文详细介绍了使用OpenCV的ArUco模块进行相机校准的过程,包括生成ChAruco板、校准相机并保存参数、验证校准结果等步骤。通过代码示例展示了如何检测标记、估计单标记姿态及绘制坐标轴。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 说在前面

操作系统:win10

vs 版本:2017

opencv版本:4.0.1

opencv-contrb版本:4.0.1

接上篇:【OpenCV/aruco】创建board Demo

下一篇:【OpenCV/aruco】第一个AR Demo-二维图片

  • 运行结果

  • 主要函数

OpenCV: ArUco Marker Detection

calibrateCameraAruco(相机校准)

estimatePoseSingleMarkers (单标记姿态估计)

drawAxis(绘制坐标系轴

  • 代码-生成ChAruco (这里使用官方提供的代码,这里

若使用visual studio,可在属性中添加参数("chboard.png" -w=5 -h=7 -sl=200 -ml=120 -d=10)

使用ChArUco原因:相机校准更加准确。

  • 代码-校准相机并保存参数(这里使用官方提供的代码,这里

若使用visual studio,可在属性中添加参数("camera.yml" -dp="detector_params.yml" -w=5 -h=7 -sl=0.04 -ml=0.02 -d=10)

 detector_params.yml 官方也提供了,放在工作目录(源代码路径)下即可

%YAML:1.0
nmarkers: 1024
adaptiveThreshWinSizeMin: 3
adaptiveThreshWinSizeMax: 23
adaptiveThreshWinSizeStep: 10
adaptiveThreshWinSize: 21
adaptiveThreshConstant: 7
minMarkerPerimeterRate: 0.03
maxMarkerPerimeterRate: 4.0
polygonalApproxAccuracyRate: 0.05
minCornerDistance: 10.0
minDistanceToBorder: 3
minMarkerDistance: 10.0
minMarkerDistanceRate: 0.05
cornerRefinementMethod: 0
cornerRefinementWinSize: 5
cornerRefinementMaxIterations: 30
cornerRefinementMinAccuracy: 0.1
markerBorderBits: 1
perspectiveRemovePixelPerCell: 8
perspectiveRemoveIgnoredMarginPerCell: 0.13
maxErroneousBitsInBorderRate: 0.04
minOtsuStdDev: 5.0
errorCorrectionRate: 0.6

程序运行后,点一下窗口,按下“c”捕捉当前帧作为校准数据,大概10帧左右(多角度)就可以了;然后按下"esc"键退出并将结果保存至camera.yml。 

  • 代码-验证校准结果
#include <opencv2\highgui.hpp>
#include <opencv2\videoio.hpp>
#include <opencv2\aruco.hpp>
#include <opencv2\aruco\dictionary.hpp>
#include <opencv2\aruco\charuco.hpp>
#include <opencv2\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	cv::VideoCapture inputVideo(1);//外置摄像头,自带摄像头请使用0
	//VideoWriter writer("VideoTest.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
	cv::Mat cameraMatrix, distCoeffs; // 相机参数

	FileStorage fs("camera.yml", FileStorage::READ);//读取相机参数
	if (!fs.isOpened())
	{
		cout << "Could not open the configuration file!" << endl;
		exit(1);
	}
	fs["camera_matrix"] >> cameraMatrix;
	fs["distortion_coefficients"] >> distCoeffs;
	fs.release();
	cout << cameraMatrix << endl;
	cout << distCoeffs << endl;

	Ptr<aruco::Dictionary> dictionary =
		aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_50);//创建字典

	while (inputVideo.grab()) {
		unsigned int i = 0;
		cv::Mat image, imageCopy;

		inputVideo.retrieve(image);
		image.copyTo(imageCopy);

		std::vector<int> ids;
		std::vector<std::vector<cv::Point2f> > corners;

		cv::aruco::detectMarkers(image, dictionary, corners, ids);// 检测markers

		if (ids.size() > 0) {
			cv::aruco::drawDetectedMarkers(imageCopy, corners, ids);
			vector< Vec3d > rvecs, tvecs;//得到旋转矢量以及平移矢量
			cv::aruco::estimatePoseSingleMarkers(corners, 100, cameraMatrix, distCoeffs, rvecs, tvecs); 
			
			for (i = 0; i < ids.size(); i++)
				cv::aruco::drawAxis(imageCopy, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 50);// 画方向轴
			//writer << imageCopy;
		}

		cv::imshow("out", imageCopy);

		char key = (char)cv::waitKey(20);
		if (key == 'b') break;
	}

	return 0;
}

<think>好的,我需要帮用户理解他们提供的命令。这个命令是`cp -r Workspace/aruco-3.1.12/build/utils_calibration/camera_640x480.yml Workspace/aruco-3.1.12/camera_config`。首先,我要分解每个部分的作用。 用户可能是在处理相机校准文件,可能在使用ArUco库。命令中的`cp`是复制,`-r`参数通常用于递归复制目录,但这里复制的是单个YAML文件。可能用户误用了`-r`,或者对参数不熟悉,需要指出这一点。 接下来,源路径和目标路径是否正确?源文件`camera_640x480.yml`看起来是校准生成的配置文件,目标目录`camera_config`可能是存储配置的地方。需要确认目标是否存在,如果不存在,`cp`会创建吗?或者是否需要先创建目录? 还要检查可能的错误,比如路径是否正确,权限是否足够。如果目标目录不存在,不加`-r`的话,`cp`会报错,所以用户可能需要先创建目录,或者去掉`-r`参数。 最后,是否需要提醒用户验证复制后的文件,确保校准参数正确应用?可能需要检查文件内容或路径在应用中的配置是否正确。</think>你提供的指令是Linux系统下的文件复制操作命令,具体解析如下: **命令结构分解**: ```shell cp -r Workspace/aruco-3.1.12/build/utils_calibration/camera_640x480.yml Workspace/aruco-3.1.12/camera_config ``` **逐步说明**: 1. `cp` 是copy的缩写,用于文件/目录的复制操作 2. `-r` 参数通常表示递归复制(用于目录),但这里存在**参数误用**: - ✅ 实际需要复制的对象是单个YAML文件(`.yml`后缀) - ❌ `-r`参数对单个文件操作无意义,可安全移除 3. **源文件路径**: ```shell Workspace/aruco-3.1.12/build/utils_calibration/camera_640x480.yml ``` - 这是ArUco标记库生成的相机校准文件 - 包含相机内参矩阵($f_x, f_y$)和畸变系数($k_1, k_2, p_1, p_2, k_3$) 4. **目标路径**: ```shell Workspace/aruco-3.1.12/camera_config ``` - 建议的目标目录用于集中管理配置文件 - 需确认该目录是否存在,否则命令会失败 **推荐改进命令**: ```shell # 先创建目标目录(如果不存在) mkdir -p Workspace/aruco-3.1.12/camera_config # 执行无递归参数的复制 cp Workspace/aruco-3.1.12/build/utils_calibration/camera_640x480.yml Workspace/aruco-3.1.12/camera_config/ ``` **验证操作**: ```shell # 检查目标文件是否存在 ls -l Workspace/aruco-3.1.12/camera_config/camera_640x480.yml # 对比文件哈希值(确保复制完整) md5sum Workspace/aruco-3.1.12/build/utils_calibration/camera_640x480.yml md5sum Workspace/aruco-3.1.12/camera_config/camera_640x480.yml ``` **技术细节**: 该YAML文件通常包含如下格式的相机参数(示例): $$ \begin{aligned} image\_width &: 640 \\ image\_height &: 480 \\ camera\_matrix &: \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \\ distortion\_coefficients &: [k_1, k_2, p_1, p_2, k_3] \end{aligned} $$ 建议在使用前通过OpenCV的`FileStorage`类验证文件完整性: ```cpp cv::FileStorage fs("camera_config/camera_640x480.yml", cv::FileStorage::READ); ```
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值