手机单目相机内参标定

使用软件:

参考我之前的文章:

软件地址: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转化为图片集,参考代码:

自己设定

python 复制代码
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.将图片转化为需要的形式,比如我这里手机采用横屏录制,那么我需要额外处理一下图片集,参考代码:

python 复制代码
import os
from PIL import Image


def 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:

标定效果:

标定代码:

python 复制代码
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)
相关推荐
黑妹天下第一乖2 小时前
第 12 讲:阿加犀 AidLux 部署与量产——把端侧 AI 应用做成 7×24 产品
人工智能·嵌入式硬件·数码相机·接口隔离原则·iot
高升说3 小时前
BEV环视硬件搭建全解析:机位、视场、链路与同步的工程方法
人工智能·数码相机
开开心心就好3 小时前
视频压缩工具推荐,绿色版免安装双击即用
java·前端·人工智能·spring·智能手机·intellij-idea·excel
老李IT笔记4 小时前
从备份恢复会把管理状态带回来吗:iOS 27 之后答案变了|MDM.Plus
ios·智能手机
黑妹天下第一乖5 小时前
第 10 讲:阿加犀 AidVoice 端侧语音交互与语音识别实战
图像处理·人工智能·数码相机·opencv·交互·语音识别·xcode
DP DPharness18 小时前
StudyMate 从安装到第一节课的完整操作路径
人工智能·websocket·网络协议·智能手机·dpharness
黑妹天下第一乖1 天前
第 05 讲:阿加犀 AidCV 图像处理加速与 OpenCV 一致开发实战
开发语言·图像处理·人工智能·嵌入式硬件·数码相机·opencv·计算机视觉
黑妹天下第一乖1 天前
第08讲 · 视觉与相机流水:Spectra ISP 与实时检测
人工智能·嵌入式硬件·数码相机·机器人·接口隔离原则·iot
DP DPharness2 天前
手机连不上 DSH 时的排错顺序:从 401 到 WebSocket 放行
websocket·网络协议·智能手机
Mark White2 天前
ICCV 2019【从颜色科学到相机】02_颜色从哪里来?从光谱、同色异谱到 CIE XYZ
数码相机