OpenCV实现张正友标定棋盘格获取相机内外参数并进行校正

#用的github上的张正友标定法,下面是获取1080p图像的程序
#运行指令:python3 calibration.py --image_size 1920x1080 --mode calibrate --corner 8x6 --square 20

import cv2

# 打开摄像头或视频文件
cap = cv2.VideoCapture(0)  # 0表示默认摄像头,你也可以指定视频文件路径

# 设置摄像头的分辨率为1080p
cap.set(3, 1920)  # 设置帧宽度
cap.set(4, 1080)  # 设置帧高度

# 设置保存帧的间隔(例如,每秒保存一帧)
frame_interval = 30  # 这将每隔30帧保存一次,约等于每秒保存一帧

frame_count = 0  # 用于计数帧

while True:
    ret, frame = cap.read()  # 读取一帧图像
    if not ret:
        break

    frame_count += 1

    # 保存每秒的其中一帧
    if frame_count % frame_interval == 0:
        cv2.imwrite(f'frame_{frame_count}.jpg', frame)

    cv2.imshow('Frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
#根据图像进行校正并获取相机内外参数 这个版本最后没用
import cv2
import numpy as np

# 读取标定图像
image_paths = ["image1.jpg", "image2.jpg", ...]  # 替换为你的标定图像路径
images = [cv2.imread(path) for path in image_paths]

# 相机分辨率(像素)
image_width = 1920
image_height = 1080

# 棋盘格尺寸(7x10的格子,每个格子实际物理尺寸是20x20毫米)
chessboard_size = (7, 10)
square_size_mm = 22.0  # 每个方格的实际物理尺寸(毫米)

# 创建对象点列表,坐标在实际世界中定义的平面
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) * square_size_mm

# 存储角点和对象点
objpoints = []  # 对象点
imgpoints = []  # 图像点

for image in images:
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)

    if ret:
        objpoints.append(objp)
        imgpoints.append(corners)

# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (image_width, image_height), None, None)


# 输出内外参数
print("相机内参数(Camera Matrix):\n", mtx)
print("镜头畸变参数(Distortion Coefficients):\n", dist)
print("旋转向量(Rotation Vectors):\n", rvecs)
print("平移向量(Translation Vectors):\n", tvecs)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV是一个广泛使用的计算机视觉库,可以用于处理图像和视频数据,支持各种特征提取,对象检测,跟踪,识别等视觉任务。其中相机标定是计算机视觉领域中一个非常重要的问题,它涉及到了相机内参,外参的估计和矫正,是各种视觉任务的基础。张正友相机标定算法是一种经典的方法,它可以通过使用多个不同角度拍摄的物体的多个图片来提取相机的内参和外参。 在OpenCV中,实现张正友相机标定算法,步骤如下: 1.读取图像。首先,您需要使用OpenCV中的imread()函数从磁盘上读取每个图像。 2.提取角点。接下来,您使用cv2.findChessboardCorners()函数或cv2.findCirclesGrid()函数来检测图像中的棋盘的角点或圆形略点。它会输出包含每个角点位置的坐标向量。 3.对角点进行亚像素级别的精确测量。然后,使用cv2.cornerSubPix()函数进行亚像素级别的精确测量。 4.初始化对象点和图像点。现在,你需要设置对象点(相对于相机坐标系统的点)和图像点(图像坐标上对应的点)来进行标定。 5.运行相机标定算法。使用cv2.calibrateCamera()函数来运行相机标定算法,它会返回内部参数矩阵和畸变系数矩阵。 6.矫正畸变。使用cv2.undistort()函数来进行畸变矫正,这将产生更准确的图像。 7.评估标定结果。最后,您可以使用cv2.projectPoints()函数将对象点投影到图像空间,并与标准图像比较来评估标定结果的准确性。 总的来说,通过使用OpenCV张正友相机标定,您可以很容易地优化相机的几何校正,从而提高各种计算机视觉任务的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值