相机参数标定

这篇博客详细介绍了如何使用Python和OpenCV进行相机标定,包括设置亚像素角点参数、寻找棋盘格角点、进行亚像素精确化以及图像校正的过程。通过读取图片,提取并存储角点信息,最终计算得到相机内参矩阵、畸变系数、旋转向量和平移向量,并展示了图像矫正前后的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我还是个新手小白,所以我的代码中的注释非常多,很适合也是新手的人。

这个是完整的代码,直接放到pycharm就可以运行的。里面的地址要改成自己的文件地址。

import cv2
import numpy as np
import glob

# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)

# 获取标定板角点的位置
objp = np.zeros((14 * 19, 3), np.float32)
objp[:, :2] = np.mgrid[0:19, 0:14].T.reshape(-1, 2)  # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y

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

images = glob.glob(r'.test/*.jpg')
i=0;
for fname in images: # for  in 循环
    img = cv2.imread(fname)
    #print img
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    size = gray.shape[::-1] #  gray的size转置
    ret, corners = cv2.findChessboardCorners(gray, (14, 19), None)  #  提取角点:使用函数:findChessboardCorners(image,(w,h),None);
                                                                                                              第一个参数为图片,第二个为图片横纵角点的个数。
    #print(corners)

    if ret: # ret返回值为TRUE表示找到棋盘角点,返回值为FALSE表示未找到

        obj_points.append(objp) # .append()向列表/数组添加元素

        corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)  # 在原角点的基础上寻找亚像素角点
        #print(corners2)
        if [corners2]:
            img_points.append(corners2)
        else:
            img_points.append(corners)

        cv2.drawChessboardCorners(img, (14, 19), corners, ret)  # 记住,OpenCV的绘制函数一般无返回值
        i+=1;
        cv2.imwrite('conimg'+str(i)+'.jpg', img)  # 保存图片 cv2.imwrite('lena.jpg', img, flag) 第一个参数是要保存的文件名,第二个参数是要保存的图像的名字。
        cv2.waitKey(1500) # waitKey函数功能 说白了就是对键盘事件进行delay(ms)的等待(delay=0则为无限等待),若触发则返回该按键的ASSIC码(否则返回-1)

print(len(img_points))#  len() 方法返回对象(字符、列表、元组等)长度或项目个数。
cv2.destroyAllWindows() # cv2.destroyAllWindows() 用来删除窗口的,()里不指定任何参数,则删除所有窗口,删除特定的窗口,往()输入特定的窗口值。

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

print("ret:", ret)
print("mtx:\n", mtx) # 内参数矩阵
print("dist:\n", dist)  # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs)  # 旋转向量  # 外参数
print("tvecs:\n", tvecs ) # 平移向量  # 外参数

print("-----------------------------------------------------")

img = cv2.imread(images[2])
h, w = img.shape[:2]  # img.shape(rows, columns, channels),[:2]表示.shape中的2个元素
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))#显示更大范围的图片(正常重映射之后会删掉一部分图像)
print (newcameramtx)
print("------------------使用undistort函数-------------------")
dst = cv2.undistort(img,mtx,dist,None,newcameramtx) 
#cv2.undistort()函数对图像进行畸变的矫正undistort(src,mtx,dist,dst,newcameramtx) 
第一个参数src,输入参数,代表畸变的原始图像;
第二个参数cameraMatrix,为之前求得的相机的内参矩阵;
第三个参数distCoeffs,为之前求得的相机畸变矩阵;
第四个参数dst,矫正后的输出图像,跟输入图像具有相同的类型和大小;
第五个参数newCameraMatrix,默认跟cameraMatrix保持一致;

x,y,w,h = roi
dst1 = dst[y:y+h,x:x+w]
cv2.imwrite('calibresult3.jpg', dst1)
print ("方法一:dst的大小为:", dst1.shape)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值