手机单目相机内参标定

使用软件:

参考我之前的文章:
软件地址:https://github.com/DavidGillsjo/VideoIMUCapture-Android/releases

棋盘标定板下载

链接: https://pan.baidu.com/s/1wiPJsEf87Vc0D7KwJnt3GA?pwd=1234 
提取码: 1234 

过程

1.使用下载的软件录制一段视频,使用详见我的另一个文章
https://blog.csdn.net/qin_liang/article/details/127612977

录制的时候,可以使用电脑来显示这个棋盘格,只要根据视频上格子的大小修改标定代码中相应位置就行。录制时围绕棋盘格旋转拍摄就行。

2.录制后的视频使用ffmpeg转化为图片集,参考代码:
自己设定

import os
scene='calib'
ff_cmd = 'ffmpeg -i ./data/'+scene+'/'+scene+'.mp4 -qscale:v 1 -qmin 1 -vf fps=2 ./data/'+scene+'/input/%04d.jpg'
os.system(ff_cmd)

3.将图片转化为需要的形式,比如我这里手机采用横屏录制,那么我需要额外处理一下图片集,参考代码:

import os
from PIL import Imagedef flip_images_in_folder(src_folder, dst_folder):# 创建目标文件夹,如果它不存在os.makedirs(dst_folder, exist_ok=True)# 遍历源文件夹中的所有文件for filename in os.listdir(src_folder):# 检查文件是否是图片(这里仅检查扩展名,可能需要根据实际情况调整)if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):# 完整路径src_path = os.path.join(src_folder, filename)dst_path = os.path.join(dst_folder, filename)# 打开图片with Image.open(src_path) as img:# 转置图片(横竖翻转)img = img.transpose(Image.TRANSPOSE)flipped_img = img.transpose(Image.FLIP_TOP_BOTTOM)# 保存转置后的图片flipped_img.save(dst_path)print(f"Flipped image saved to {dst_path}")# 使用示例# 指定源文件夹和目标文件夹
source_folder = 'D:\Data\PythonProject\gaussian-splatting\data\calib\input'  # 源文件夹路径
destination_folder = 'D:\Data\PythonProject\gaussian-splatting\data\calib\input_ok'  # 目标文件夹路径# 调用函数翻转图片
flip_images_in_folder(source_folder, destination_folder)

得到的横向的图片集:
在这里插入图片描述

4.处理后的图片集就可以直接使用如下的代码进行标定,注意根据自己的情况修改格子size:

标定效果:
在这里插入图片描述

标定代码:

import numpy as np
import cv2
import os
from PIL import Image# 遍历照片
def read_images_from_folder(folder_path):images = []for filename in os.listdir(folder_path):if filename.endswith(".jpg") or filename.endswith(".png"):image_path = os.path.join(folder_path, filename)try:image = Image.open(image_path)images.append(image_path)except IOError:print("Cannot open image: ", filename)return images# 标定板格点数量和大小
pattern_size = (8, 6)  # 内部角点数量
square_size = 20  # 棋盘格方块大小(毫米)# 存储棋盘格角点的3D坐标
obj_points = []
# 存储棋盘格对应的图像点坐标
img_points = []# 准备棋盘格的3D坐标
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), dtype=np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) * square_size# 指定文件夹路径
folder_path = "D:\Data\PythonProject\gaussian-splatting\data\calib\input_ok"
# 调用函数读取图片
images = read_images_from_folder(folder_path)# 遍历所有标定图像
for image_path in images:# 读取图像并将其转换为灰度图image = cv2.imread(image_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 查找棋盘格角点ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)# 如果找到棋盘格角点则存储对应的3D和2D坐标if ret:obj_points.append(objp)img_points.append(corners)# 在图像上绘制棋盘格角点cv2.drawChessboardCorners(image, pattern_size, corners, ret)cv2.imshow('Chessboard Corners', image)cv2.waitKey(500)# 进行相机内参标定
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)# 打印相机内参和畸变系数
print("Camera Matrix:\n", camera_matrix)
print("\nDistortion Coefficients:\n", dist_coeffs)
np.savetxt('camera_matrix.txt', camera_matrix)
np.savetxt('dist_coeffs.txt', dist_coeffs)

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Ps:直方图

直方图 Histogram是一个用二维坐标表示图像像素或分量值强度分布的图形。 Ps菜单:窗口/直方图 Window/Histogram 几乎所有的图像处理软件里都有直方图,大多数的相机里也内置了直方图。 ◆ ◆ ◆ 直方图的构成 直方图是一个二维坐标系统,横坐…

docker安装flink

docker安装flink 5.1、拉取flink镜像,创建网络 docker pull flink docker network create flink-network5.2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES&…

橘子学es原理01之准备工作

es本身是具备很好的使用特性的,我指的是他的部署方面的,至于后期的使用和运维那还是很一眼难尽的。 我们从这一篇开始就着重于es的一些原理性的的一些探讨,当然我们也会有一些操作性的,业务性的会分为多个栏目来写。比如前面我写的…

hbuilderx创建、运行uni-app

创建uni-app 在点击工具栏里的文件 -> 新建 -> 项目: 选择uni-app类型,输入工程名,选择模板,点击创建,即可成功创建。 uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还有一个重要模…

编码后的字符串lua

-- 长字符串 local long_string "你好你好你好你好你好你好你好你好" local encoded_string "" for i 1, #long_string do local char_code string.byte (long_string, i) encoded_string encoded_string .. char_code .. "," end encoded_…

vulnhub靶场之driftingblues-1

一.环境搭建 1.靶场描述 get flags difficulty: easy about vm: tested and exported from virtualbox. dhcp and nested vtx/amdv enabled. you can contact me by email (it should be on my profile) for troubleshooting or questions. 2.靶场下载 https://www.vulnhub.…

贪婪算法入门指南

想象一下,你在玩一款捡金币的游戏。在这个游戏里,地图中散布着各种大小不一的金币,而你的目标就是尽可能快地收集到最多的金币。你可能会采取一个直观的策略:每次都去捡最近的、看起来最大的金币。这种在每一步都采取局部最优解的…

【Linux基础】Linux自动化构建工具make/makefile

背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后…

FPGA之16:1复选器

每个slice 都有一个F8MUX。F8MUX原语: MUXF8 MUXF8_inst( .0(0),Il Output of MUX to general routing .I0(10),//Input(tie to MUXF7L/LO out) .I1&#xf…

复旦大学MBA:AIGC时代,科技与商业迸发更绚烂的火花

ChatGPT问世以来,AI技术及应用进入一个全速推进的通道,快速迈入通用大模型时代。从AGI(人工通用智能)到AIGC(AI多模态内容生成),AI正在飞速重塑各个行业、人类生活乃至人类的未来。在商业领域更是给营销场景和营销工具…

《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)

文章目录 3.1 编写 Dockerfile3.1.1 重点基础知识3.1.2 重点案例:创建简单 Python 应用的 Docker 镜像3.1.3 拓展案例 1:Dockerfile 优化3.1.4 拓展案例 2:多阶段构建 3.2 构建流程深入解析3.2.1 重点基础知识3.2.2 重点案例:构建…

基于Java+SSM+Jsp宿舍管理系统(源码+演示视频+包运行成功+Maven版)

您好,我是码农小波(wei158888),感谢您阅读本文,欢迎一键三连哦。 ❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。 目录 1、项目背景 2、项目演示 3、使用技术 4、系统设计 …

Unity中URP实现水体效果(泡沫)

文章目录 前言一、给水上色1、我们在属性面板定义两个颜色2、在常量缓冲区申明这两个颜色3、在片元着色器中,使用深度图对这两个颜色进行线性插值,实现渐变的效果 二、实现泡沫效果1、采样 泡沫使用的噪波纹理2、控制噪波效果强弱3、定义_FoamRange来控制…

Android14之input高级调试技巧(一百八十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Android 内存优化内存泄漏处理

一:匿名内部类/非静态内部类 匿名内部类的泄漏原因:匿名内部类会隐式地持有外部类的引用.当外部类被销毁时,内部类并不会自动销毁,因为内部类并不是外部类的成员变量, 它们只是在外部类的作用域内创建的对象,所以内部…

数据结构与算法相关题解20240225

数据结构与算法相关题解20240225 一、58. 最后一个单词的长度二、48. 旋转图像三、69. x 的平方根四、50. Pow(x, n) 一、58. 最后一个单词的长度 简单 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度…

开源世界的学术问题

自由软件基金会是1983年成立的,到现在是41年。正好很有意思的是,在去年还有一篇文章(CSDN 的翻译),专门在质疑说成立 40 年的自由软件基金会是不是已经快不行了,所以我们会用这个标题叫做兴衰发展历程来介绍…

无人机精准定位技术,GPS差分技术基础,RTK原理技术详解

差分GPS的基本原理 差分GPS(Differential GPS,简称DGPS)的基本原理是利用一个或多个已知精确坐标的基准站,与用户(移动站)同时接收相同的GPS卫星信号。由于GPS定位时会受到诸如卫星星历误差、卫星钟差、大…

创建者模式(Builder Pattern):构造复杂对象的通用解决方案

文章目录 **一、技术背景与应用场景****为何使用创建者模式?****典型应用场景包括但不限于:** **二、创建者模式定义与结构****三、使用步骤举例**四、优缺点分析总结 一、技术背景与应用场景 创建者模式是一种对象创建型设计模式,它通过将复…

修复Microsoft Edge WebView2无法安装的问题

修复Microsoft Edge WebView2无法安装的问题 场景解决方案 场景 系统:win11 电脑:联想14 前提:使用Geek Uninstaller强制删除了Microsoft Edge WebView2 同时下载了clash verge。 发现根本无法运行(点击了无任何反应且图标颜色…