一、简介
本文提供了鱼眼及普通相机的标定python版源码,调用opencv的接口,原理为张正友标定法。这里不过多赘述,话不多说无套路直接上源码,亲测有效,搬走即用。
注:
- 需准备一个标定版,在此网站下载打印出来即可;
- 例如12x8的棋盘格内角点为11x7.
二 、源码
2.1 鱼眼相机标定
"""
~~~~~~~~~~~~~~~~~~~~~~~~~~
鱼眼相机标定
~~~~~~~~~~~~~~~~~~~~~~~~~~用法:python calibrate_camera.py \-i 0 \-grid 9x6 \-out fisheye.yaml \-framestep 20 \--resolution 640x480--fisheye
"""
import argparse
import os
import numpy as np
import cv2# 将相机参数文件保存到此目录
TARGET_DIR = os.path.join(os.getcwd(), "yaml")# 默认参数文件
DEFAULT_PARAM_FILE = os.path.join(TARGET_DIR, "calib.yaml")def main():global grayparser = argparse.ArgumentParser()# 输入视频流parser.add_argument("-i", "--input", type=int, default=0,help="输入相机设备")# 棋盘格大小parser.add_argument("-grid", "--grid", default="10x7",help="标定棋盘格的大小")parser.add_argument("-r", "--resolution", default="640x480",help="相机图像的分辨率")parser.add_argument("-framestep", type=int, default=20,help="在视频中使用每第n帧")parser.add_argument("-o", "--output", default=DEFAULT_PARAM_FILE,help="输出yaml文件的路径")args = parser.parse_args()if not os.path.exists(TARGET_DIR):os.mkdir(TARGET_DIR)text1 = "按下 c 进行标定"text2 = "按下 q 退出"text3 = "设备: {}".format(args.input)font = cv2.FONT_HERSHEY_SIMPLEXfontscale = 0.6resolution_str = args.resolution.split("x")W = int(resolution_str[0])H = int(resolution_str[1])grid_size = tuple(int(x) for x in args.grid.split("x"))grid_points = np.zeros((1, np.prod(grid_size), 3), np.float32)grid_points[0, :, :2] = np.indices(grid_size).T.reshape(-1, 2)objpoints = [] # 真实世界空间中的3D点imgpoints = [] # 图像平面中的2D点device = args.inputcap = cv2.VideoCapture(device) # 打开设备# 设置分辨率cap.set(cv2.CAP_PROP_FRAME_WIDTH, W)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, H)if cap is None or not cap.isOpened():print("无法打开设备")returnquit = Falsedo_calib = Falsei = -1while True:i += 1_r, img = cap.read