python相机标定

13 篇文章 0 订阅
8 篇文章 0 订阅
import cv2
import numpy as np
import glob

# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001(亚像素级别的角点检测)
# TERM_CRITERIA_MAX_ITER表示最大迭代次数,cv2.TERM_CRITERIA_EPS表示误差限制,迭代次数上限为300次,误差限制为0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)

# 获取标定板角点的位置(4*4)标定板格子数-1
objp = np.zeros((4 * 4, 3), np.float32)  # 仅算内角点,注意内角点即不靠近边界的角点
# 将世界坐标系建在标定板上,Z坐标全部为0,只需要赋值x和y,

objp[:, :2] = np.mgrid[0:4, 0:4].T.reshape(-1, 2)



obj_points = []  # 存储3D点
img_points = []  # 存储2D点

# glob模块查找符合特定规则的文件路径名,获取指定路径下的图片
images = glob.glob(r"E:\\DIRPIC\\pic\\camera\\*.png")

for fname in images:
    img = cv2.imread(fname)
    # 图像灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    size = gray.shape[::-1]  # 倒着取值
    # 获取图像角点(gray:灰度图,(4,4)棋盘中每行和每列角点的个数)(返回布尔值和找到的角点)
    ret, corners = cv2.findChessboardCorners(gray, (4, 4), None)


    if ret:
        # 存储三维角点坐标
        obj_points.append(objp)
        # 在原角点的基础上寻找亚像素角点,并存储二维角点坐标
        corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)
        # print(corners2)
        if [corners2]:
            img_points.append(corners2)
        else:
            img_points.append(corners)


# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)

print('------照相机内参与外参------')
print("ret:", ret)  # 标定误差
print("mtx:\n", mtx)  # 内参矩阵(fx,fy, u,v)
print("dist:\n", dist)  # 畸变参数 distortion coefficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs)  # 旋转向量 # 外参数
print("tvecs:\n", tvecs)  # 平移向量 # 外参数

img = cv2.imread(images[3])
print(images[3])
h, w = img.shape[:2]
# 计算一个新的相机内参矩阵和感兴趣区域(ROI),矫正畸变
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
print('------新内参------')
print(newcameramtx)
print('------畸变矫正后的图像new_img.jpg------')
newimg = cv2.undistort(img, mtx, dist, None, newcameramtx)
# x, y, w, h = roi
# newimg = newimg[y:y + h, x:x + w]
cv2.imwrite('new_img.jpg', newimg)
print("new_img的大小为:", newimg.shape)
  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值