当前位置: 首页 > news >正文

用OpenCV标定相机内参应用示例(C++和Python)

下面是一个完整的 使用 OpenCV 进行相机内参标定(Camera Calibration) 的示例,包括 C++ 和 Python 两个版本,基于棋盘格图案标定。


一、目标:相机标定

通过拍摄多张带有棋盘格图案的图像,估计相机的内参:

  • 相机矩阵(内参) K
  • 畸变系数 distCoeffs
  • 可选外参(R, T)
  • 标定精度指标(如重投影误差)

二、棋盘格参数设置(根据自己的棋盘格设置):

  • 棋盘格角点数:9 x 6(内角点,9列×6行);
  • 每个格子实际尺寸为:25.0 mm(自定义);
  • 图像列表已存为多张 JPG /或者其他格式图片。

三、Python 示例(

import cv2
import numpy as np
import glob# 设置棋盘格参数
chessboard_size = (9, 6)
square_size = 25.0  # mm# 生成世界坐标系下的 3D 点
objp = np.zeros((np.prod(chessboard_size), 3), np.float32)
objp[:, :2] = np.indices(chessboard_size).T.reshape(-1, 2)
objp *= square_size# 储存所有图像的角点
objpoints = []  # 3D points
imgpoints = []  # 2D points# 读取图片
images = glob.glob("calib_images/*.jpg")for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测角点ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)if ret:objpoints.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1),criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))imgpoints.append(corners2)# 可视化角点cv2.drawChessboardCorners(img, chessboard_size, corners2, ret)cv2.imshow('img', img)cv2.waitKey(100)cv2.destroyAllWindows()# 标定相机
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)print("相机内参矩阵 K:\n", K)
print("畸变系数 dist:\n", dist)
print("重投影误差:", ret)

四、C++ 示例

#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
#include <filesystem>using namespace cv;
using namespace std;int main() {Size boardSize(9, 6);float squareSize = 25.0f;vector<vector<Point3f>> objectPoints;vector<vector<Point2f>> imagePoints;vector<Point3f> objp;for (int i = 0; i < boardSize.height; ++i)for (int j = 0; j < boardSize.width; ++j)objp.emplace_back(j * squareSize, i * squareSize, 0);vector<String> imageFiles;glob("calib_images/*.jpg", imageFiles);for (const auto& fname : imageFiles) {Mat img = imread(fname);Mat gray;cvtColor(img, 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(objp);drawChessboardCorners(img, boardSize, corners, found);imshow("Corners", img);waitKey(100);}}destroyAllWindows();Mat K, distCoeffs;vector<Mat> rvecs, tvecs;calibrateCamera(objectPoints, imagePoints, Size(640, 480),K, distCoeffs, rvecs, tvecs);cout << "Camera Matrix K:\n" << K << endl;cout << "Distortion Coefficients:\n" << distCoeffs << endl;
}

五、输出参数解释

参数含义
K / cameraMatrix相机内参矩阵 (fx, fy, cx, cy)
distCoeffs畸变参数 [k1, k2, p1, p2, k3]
rvecs每张图像的旋转向量
tvecs每张图像的平移向量
ret平均重投影误差(数值越小越好)

六、应用建议

  • 拍摄图像时应尽量覆盖各个角度、不同距离;
  • 建议图像 >10 张以上;
  • 标定结果可用于 cv::undistortcv::initUndistortRectifyMap 做图像矫正;
  • 也可以用 fisheye 模型标定 (cv::fisheye::calibrate),适用于广角相机。

http://www.lryc.cn/news/583876.html

相关文章:

  • window显示驱动开发—XR_BIAS 和 PresentDXGI
  • 图像亮度调整的简单实现
  • 0基础学Python系列【31】 详细讲解Python中SQLAlchemy包的用法:从入门到精通
  • k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper
  • zookeeper etcd区别
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • macOS 上安装 Miniconda + Conda-Forge
  • 算法练习5-原地移除数组中所有的元素
  • 龙迅#LT8619B适用于HDMI转LVDS/RGB,芯片支持视频图像处理,OSD功能.
  • MacOS 终端(Terminal)配置显示日期时间
  • 在Docker中运行macOS的超方便体验!
  • 基于深度学习的自动调制识别网络(持续更新)
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 在 Mac 上使用 Git 拉取项目:完整指南
  • 【macos用镜像站体验】Claude Code入门使用教程和常用命令
  • 029_构造器重载与默认构造器
  • 基于多模态感知的裂缝2D及3D检测方案
  • 【leetcode】2236. 判断根节点是否等于子节点之和
  • git fetch的使用
  • vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值
  • TCP 保活(KeepAlive)机制详解
  • STM32F103之ModBus\RS232\RS422\RS485
  • OpenCV 图像进阶处理:特征提取与车牌识别深度解析
  • 人工智能-基础篇-28-模型上下文协议--MCP请求示例(JSON格式,客户端代码,服务端代码等示例)
  • LabVIEW 波形图表横坐标显示当前日期
  • Eigen 几何模块深拆:Isometry3d vs Affine3d + 变换矩阵本质详解
  • GitHub信息收集
  • STM32单片机_3
  • GitHub敏感信息收集与防御指南
  • esp32在vscode中仿真调试