opencv摄像头标定程序实现

摄像头标定是计算机视觉中的一个重要步骤,用于确定摄像头的内参(如焦距、主点、畸变系数等)和外参(如旋转矩阵和平移向量)。OpenCV 提供了方便的工具来进行摄像头标定。下面分别给出 C++ 和 Python 的实现。
在这里插入图片描述

1. C++ 实现

1.1 准备工作
  • 准备一个棋盘格(如 9x6 的棋盘格)。
  • 拍摄多张棋盘格图片(至少 10-15 张),确保棋盘格在不同位置和角度。
1.2 代码实现
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>using namespace cv;
using namespace std;int main() {// 棋盘格的尺寸Size boardSize(9, 6);float squareSize = 1.0f; // 棋盘格方块的物理尺寸(单位:米)// 存储棋盘格角点的三维坐标vector<vector<Point3f>> objectPoints;// 存储棋盘格角点的二维图像坐标vector<vector<Point2f>> imagePoints;// 生成棋盘格的三维坐标vector<Point3f> obj;for (int i = 0; i < boardSize.height; i++) {for (int j = 0; j < boardSize.width; j++) {obj.push_back(Point3f(j * squareSize, i * squareSize, 0));}}// 读取图像vector<String> imagePaths;glob("path/to/calibration_images/*.jpg", imagePaths);for (size_t i = 0; i < imagePaths.size(); i++) {Mat image = imread(imagePaths[i]);Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);// 查找棋盘格角点vector<Point2f> corners;bool found = findChessboardCorners(gray, boardSize, corners);if (found) {// 亚像素精确化cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1),TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 30, 0.001));imagePoints.push_back(corners);objectPoints.push_back(obj);// 绘制并显示角点drawChessboardCorners(image, boardSize, Mat(corners), found);imshow("Corners", image);waitKey(500);}}// 标定摄像头Mat cameraMatrix, distCoeffs;vector<Mat> rvecs, tvecs;double rms = calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);cout << "RMS error: " << rms << endl;cout << "Camera matrix: " << cameraMatrix << endl;cout << "Distortion coefficients: " << distCoeffs << endl;// 保存标定结果FileStorage fs("camera_calibration.yml", FileStorage::WRITE);fs << "camera_matrix" << cameraMatrix;fs << "distortion_coefficients" << distCoeffs;fs.release();return 0;
}
1.3 运行说明
  • 将棋盘格图片放在 path/to/calibration_images/ 目录下。
  • 运行程序后,标定结果将保存在 camera_calibration.yml 文件中。

2. Python 实现

2.1 准备工作
  • 准备一个棋盘格(如 9x6 的棋盘格)。
  • 拍摄多张棋盘格图片(至少 10-15 张),确保棋盘格在不同位置和角度。
2.2 代码实现
import cv2
import numpy as np
import glob# 棋盘格的尺寸
board_size = (9, 6)
square_size = 1.0  # 棋盘格方块的物理尺寸(单位:米)# 存储棋盘格角点的三维坐标
object_points = []
# 存储棋盘格角点的二维图像坐标
image_points = []# 生成棋盘格的三维坐标
objp = np.zeros((board_size[0] * board_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:board_size[0], 0:board_size[1]].T.reshape(-1, 2)
objp *= square_size# 读取图像
images = glob.glob('path/to/calibration_images/*.jpg')for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 查找棋盘格角点ret, corners = cv2.findChessboardCorners(gray, board_size, None)if ret:# 亚像素精确化corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1),(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))image_points.append(corners2)object_points.append(objp)# 绘制并显示角点cv2.drawChessboardCorners(img, board_size, corners2, ret)cv2.imshow('Corners', img)cv2.waitKey(500)# 标定摄像头
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)print("RMS error:", ret)
print("Camera matrix:\n", camera_matrix)
print("Distortion coefficients:\n", dist_coeffs)# 保存标定结果
np.savez('camera_calibration.npz', camera_matrix=camera_matrix, dist_coeffs=dist_coeffs)cv2.destroyAllWindows()
2.3 运行说明
  • 将棋盘格图片放在 path/to/calibration_images/ 目录下。
  • 运行程序后,标定结果将保存在 camera_calibration.npz 文件中。

3. 总结

  • C++ 和 Python 的实现步骤基本相同,主要包括:准备棋盘格、查找角点、亚像素精确化、标定摄像头、保存标定结果。
  • 标定结果可以用于后续的图像校正、三维重建等任务。

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

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

相关文章

java项目之网上租贸系统源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的网上租贸系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Boot的网上租贸…

协方差矩阵

协方差矩阵是一个对称矩阵&#xff0c;用来描述多个随机变量之间的协方差关系。协方差反映了两个随机变量如何共同变化的趋势&#xff0c;协方差矩阵将这种关系扩展到了多维数据。 1. 定义 假设有一个 n 维随机向量 &#xff0c;协方差矩阵 Σ 定义为&#xff1a; 其中&#…

deepin系统下开放指定端口

一、安装ufw 若已安装则跳过 sudo apt-get install ufw二、查看防火墙状态 sudo ufw status三、打开防火墙 sudo ufw enable四、开放端口 sudo ufw allow 6654/tcp五、windows下测试远程端口 telnet 192.168.1.22 6654六、关闭防火墙 sudo ufw disable附上ufw的全部命令…

我在广州学 Mysql 系列——与索引相关的练习题

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天星期二啦&#xff0c;还有三天就是星期五了&#xff0c;为了美好生活奋斗吧朋友们&#xff01; 本文将学习MYSQL中数据表内容的索引相关练习题目~~ 复习&#xff1a;&#x1f449;【索引详解】 数据库专栏&#x1f449;【数据…

通过 route 或 ip route 管理Linux主机路由

目录 一&#xff1a;route 使用说明1、查看路由信息2、删除指定路由3、增加指定路由 二&#xff1a;ip route 使用说明1、查看主机路由2、新增主机路由3、删除主机路由 通过route 或者ip route修改Linux主机路由后属于临时生效&#xff0c;系统重启后就恢复默认值了&#xff0c…

SASS 简化代码开发的基本方法

概要 本文以一个按钮开发的实例&#xff0c;介绍如何使用SASS来简化CSS代码开发的。 代码和实现 我们希望通过CSS开发下面的代码样式&#xff0c;从样式来看&#xff0c;每个按钮的基本样式相同&#xff0c;就是颜色不同。 如果按照传统的方式开发&#xff0c;需要开发btn &…

flutter 专题三十六 Flutter动态化框架Thresh

一、前言 移动端技术栈自诞生以来&#xff0c;其双端开发成本和发布效率一直广受诟病。为了解决这些问题&#xff0c;前端跨端技术一直在不断尝试&#xff0c;希望能一次开发、多端运行并且能做到快速发布。期间经历了多个技术发展阶段。 第一阶段&#xff1a;以H5为代表&…

python制作翻译软件

本文复刻此教程&#xff1a;制作属于自己的翻译软件-很简单【Python】_哔哩哔哩_bilibili 一、明确需求&#xff08;以搜狗翻译为例&#xff09; &#xff08;1&#xff09;网址&#xff1a;https://fanyi.sogou.com/text &#xff08;2&#xff09; 数据&#xff1a;翻译内容…

【C++】20.二叉搜索树

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的性能分析3. 二叉搜索树的插入4. 二叉搜索树的查找5. 二叉搜索树的删除6. 二叉搜索树的实现代码7. 二叉搜索树key和key/value使用场景7.1 key搜索场景&#xff1a;7.2 key/value搜索场景&#xff1a;7.3 主要区别&#xff1a;7.4 ke…

Opencv图片的旋转和图片的模板匹配

图片的旋转和图片的模板匹配 目录 图片的旋转和图片的模板匹配1 图片的旋转1.1 numpy旋转1.1.1 函数1.1.2 测试 1.2 opencv旋转1.2.1 函数1.2.2 测试 2 图片的模板匹配2.1 函数2.2 实际测试 1 图片的旋转 1.1 numpy旋转 1.1.1 函数 np.rot90(kl,k1)&#xff0c;k1逆时针旋转9…

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来&#xff0c;使得算法可以独立于使用它的客户端而变化&#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…

【GOOD】A Survey of Deep Graph Learning under Distribution Shifts

深度图学习在分布偏移下的综述&#xff1a;从图的分布外泛化到自适应 Northwestern University, USA Repository Abstract 图上的分布变化——训练和使用图机器学习模型之间的数据分布差异——在现实世界中普遍存在&#xff0c;并且通常不可避免。这些变化可能会严重恶化模…

【Axure高保真原型】环形进度条(开始暂停效果)

今天和大家分享环形进度条&#xff08;开始暂停效果&#xff09;的原型模版&#xff0c;效果包括&#xff1a; 点击开始按钮&#xff0c;可以环形进度条开始读取&#xff0c;中部百分比显示环形的读取进度&#xff1b; 在读取过程中&#xff0c;点击暂停按钮&#xff0c;可以随…

Euler 21.10(华为欧拉)安装oracle19c-RAC

1. Euler 21.10安装oracle19c-RAC 1.1. 环境规划 1.1.1. 主机规划 hostname IP 实例名 hfdb90 192.168.40.90 hfdb1 hfdb91 192.168.40.90 hfdb2 系统版本 BigCloud Enterprise Linux For Euler 21.10 (GNU/Linux 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 x86_6…

【python】matplotlib(radar chart)

文章目录 1、功能描述和原理介绍2、代码实现3、效果展示4、完整代码5、多个雷达图绘制在一张图上6、参考 1、功能描述和原理介绍 基于 matplotlib 实现雷达图的绘制 一、雷达图的基本概念 雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也被称为蛛网图或星型图&…

Business Cooperation Process

Business Cooperation Process 商务合作基本流程 并不是每个人都能做到言而有信的&#xff0c;因此还是需要流程来约束的。

模式识别-Ch2-分类错误率

分类错误率 最小错误率贝叶斯决策 样本 x x x的错误率&#xff1a; 任一决策都可能会有错误。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

Milvus×全诊通:从导诊到智能超声,如何将人效比翻倍

AI与智慧医疗的结合已是未来发展的必然趋势。近年来&#xff0c;国家卫健委推崇智慧医疗和AI技术&#xff0c;如智能导诊、预问诊、辅助诊断等&#xff0c;以提高医疗服务效率和诊断准确性&#xff0c;改善患者就医体验。 全诊通是一家专注于医疗SaaS和人工智能的公司&#xff…

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具&#xff0c;故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著&#xff1b;出版时间&#xff1a;2023年3月 二、图像的分类、分割与检测任务区别 如图所示&#xff0c;这些更高阶的…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…