[Computer Vision]实验四:相机标定

目录

一、实验内容

二、实验过程及结果

[2.1 实验代码](#2.1 实验代码)

[2.2 实验结果及分析](#2.2 实验结果及分析)


一、实验 内容

了解针孔照相机的相关知识,实现相机标定。(可使用提供的棋盘格或自行打印)

  1. 可视化棋盘格关键点、匹配点数(可加ransac)
  2. 输出棋盘格图片对应的单应性矩阵H(打印至少2张)
  3. 打印相机内参(高亮焦距)、不同棋盘格图像对应的外参

二、实验过程及结果

2.1 实验代码
python 复制代码
import cv2
import numpy as np
import glob

pattern_size=(8,11)
square_size=2
obj_points=[]
img_points=[]
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) * square_size
images_path="D:/Computer vision/Chessboard_picture/*.jpg"
images=glob.glob(images_path)

for fname in images:
    img=cv2.imread(fname)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret,corners=cv2.findChessboardCorners(gray,pattern_size)
    if ret:
        obj_points.append(objp)

        corners2=cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))
        img_points.append(corners2)
        print(f"{fname}的角点数量:{len(corners)}")
        img=cv2.drawChessboardCorners(img,pattern_size,corners2,ret)
        cv2.imshow('img',img)
        cv2.waitKey(500)
        new_fname='calib_'+fname.split("\\")[-1]
        cv2.imwrite(new_fname,img)
cv2.destroyAllWindows()

ret,mtx,dist,rvecs,tvecs=cv2.calibrateCamera(obj_points,img_points,gray.shape[::-1],None,None)
print("内参矩阵:")
print(mtx)
print("畸变系数:")
print(dist)

mean_error = 0
for i in range(len(obj_points)):
    img_points2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(img_points[i], img_points2, cv2.NORM_L2) / len(img_points2)
    mean_error += error
print("平均重投影误差:{}".format(mean_error / len(obj_points)))

for i in range(len(rvecs)):
    print("第{}张图片的外参矩阵:".format(i + 1))
    R = cv2.Rodrigues(rvecs[i])[0]
    print(R)
    print(tvecs[i])

if len(img_points) >= 2:
    for i in range(len(img_points) - 1):
        H, mask = cv2.findHomography(img_points[i], img_points[i + 1], cv2.RANSAC)
        print(f"第{i + 1}到第{i + 2}张图片的单应性矩阵H:")
        print(H)
        print(f"匹配点数(RANSAC前):{len(img_points[i])}")
        print(f"匹配点数(RANSAC后):{np.sum(mask)}")
else:
print("没有足够的图片来计算单应性矩阵H")
for fname in images:
    img=cv2.imread(fname)
    h, w = img.shape[:2]
    new_camera_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
    dst = cv2.undistort(img, mtx, dist, None, new_camera_mtx)
    x, y, w, h = roi
    dst = dst[y:y+h, x:x+w]
    cv2.imshow('undistorted', dst)
    cv2.waitKey()
    corrected_fname = 'corrected_' + fname.split("\\")[-1]
    cv2.imwrite(corrected_fname, dst)
cv2.destroyAllWindows()
2.2 实验结果及分析

实验结果如下图所示:

1.如图1所示,打印了每个图片的角点数量,结果图中显示的7张图片均被检测到了88个角点;

2.如图1所示,打印了内参矩阵(mtx)包含了相机的焦距(fx, fy)和主点坐标(cx, cy),畸变系数(dist)描述了镜头的径向和切向畸变。这些参数用于校正图像中的畸变,使得图像更加真实。根据图片中的结果显示,fx=270.9028,fy=248.6261,cx=135.2334,cy=131.0869

3.计算重投影误差,如图2所示。重投影误差反映了实际图像点与通过标定参数(内参矩阵、畸变系数)反投影得到的图像点之间的差异,差异越小,说明标定结果越精确。实验中得到的重投影误差为0.4628

4.如图3所示,打印输出每张图片的外参矩阵,包括旋转矩阵R和平移向量tves。

5.如图4所示,打印相邻图片之间的单应性矩阵,描述两个视角之间的投影变换关系。通过RANSAC算法可以过滤掉一些错误的匹配点,从而得到更可靠的单应性矩阵。

6.最后在图片中绘制并显示角点,如图5所示。

7.根据畸变系数进行图像矫正,结果如图6所示。
图1 图2
图3
图4 图5
图6

相关推荐
Yao.Li1 小时前
PVN3D ORT CUDA Custom Ops 实现与联调记录
人工智能·3d·具身智能
诺伦1 小时前
LocalClaw 在智能制造的新机会:6部门AI+电商政策下的工厂AI升级方案
人工智能·制造
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬7 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志7 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114247 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠7 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光8 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好8 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力8 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用