三维测量与建模笔记 - 3 Python Opencv实现相机标定

复制代码
import cv2
import numpy as np
import glob
import matplotlib.pyplot as plt

cv2.__version__
#参考链接
#https://docs.opencv.org/3.4/dc/dbb/tutorial_py_calibration.html


#相关参数
#设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # 阈值
#棋盘格每行每列方块角点个数
w = 9
h = 6
#棋盘格方块边长(mm)
side = 10

#世界坐标下的棋盘格角点坐标如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
objp = objp*side  # 边长side(mm)

#保存图片中的角点
world_points = [] #世界坐标系
img_points = [] #相平面坐标系

#拍摄的棋盘格图像文件列表
images = glob.glob('./imgs/*.jpg')
print("Image Files:",images)


#读取所有图片,检测角点,拿到世界坐标和相平面坐标
i=0
for fname in images:

    img = cv2.imread(fname)
    # 获取画面中心点
    #获取图像的长宽
    h1, w1 = img.shape[0], img.shape[1]
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    u, v = img.shape[:2]
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        print("i:", i)
        i = i+1
        # 在原角点的基础上寻找亚像素角点
        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        #追加进入世界三维点和平面二维点中
        world_points.append(objp)
        img_points.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w,h), corners, ret)
        cv2.namedWindow('findCorners', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('findCorners', 640, 480)
        cv2.imshow('findCorners',img)
        cv2.waitKey(1000)
cv2.destroyAllWindows()

#进行标定
ret, mtx, dist, rvecs, tvecs = \
    cv2.calibrateCamera(world_points, img_points, gray.shape[::-1], None, None)
print("Error:", ret)
print("Instrinsic Matrix:\n",mtx)      # 内参数矩阵
print("Distortion Coeff:\n", dist   )   # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("Rotation Vectors:\n",rvecs)   # 旋转向量  # 外参数
print("Translation Vectors:\n",tvecs  )  # 平移向量  # 外参数

#使用去畸变参数
img = cv2.imread('./imgs/6.jpg')
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (u, v), 0, (u, v))
# 纠正畸变
dst1 = cv2.undistort(img, mtx, dist, None, newcameramtx)

mapx,mapy=cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w1,h1),5)
dst2=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
# 裁剪图像,输出纠正畸变以后的图片
x, y, w1, h1 = roi
dst1 = dst1[y:y + h1, x:x + w1]

plt.figure(1, figsize=(8,6), dpi=100)
plt.imshow(img)

plt.figure(1, figsize=(8,6), dpi=100)
plt.imshow(dst1)

plt.figure(1, figsize=(8,6), dpi=100)
plt.imshow(dst2)

相关推荐
Rabitebla11 分钟前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
叼烟扛炮1 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
小小张说故事1 小时前
Python 的 __init__ 到底是不是构造函数?拆开 __new__ 先造对象、那次被跳过的初始化和必须返回 None 的规矩
python
景煜拾年1 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
旖旎夜光1 小时前
【C++ 基础入门】类和对象(下):初始化列表、static 成员、友元与内部类
c++·笔记·学习
拖累斯1 小时前
Jenkins + Python 全自动跑通「禅道任务/BUG 导出 → 月度开发考核表」
python·jenkins·bug
LONGZHIQIN2 小时前
STM32学习笔记
笔记·stm32·学习·arm
叼烟扛炮2 小时前
[LangChain] 学习笔记(04):手搓 ChatGPT 打字机——流式输出(SSE)与模型初始化选型
人工智能·笔记·chatgpt·langchain
特立独行的猫A2 小时前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python