python相机标定

python相机标定

采用的是张正友方法,参考以下文章:https://github.com/Nocami/PythonComputerVision-6-CameraCalibration
在该方法的基础上实现了批量的定标,便于软件设计。

# -*- coding: utf-8 -*-
from cv2 import cv2
import numpy as np
import glob
class Cphoto_pre_work:

    def __init__(self):
        self.obj_points = []  # 存储3D点
        self.img_points = []  # 存储2D点
        self.size=[]
        self.ret=[]
        self.mtx=[]
        self.dist=[]
        self.rvecs=[]
        self.tvecs=[]
        self.list1=['ret','mtx','dist','rvecs','tvecs']
        self.savesrc5=[]

    def get_grid(self,src,src_corner):
        #进行标定
        #src:图像路径
        #src_corner:棋盘格坐标路径
        images = glob.glob(src)
        # 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

        # 获取标定板角点的位置
        objp = np.zeros((4*6,3), np.float32)
        objp[:,:2] = np.mgrid[0:6,0:4].T.reshape(-1,2)  # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y
        i=0
        for fname in images:
            img = cv2.imread(fname)
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            self.size = gray.shape[::-1]
            ret, corners = cv2.findChessboardCorners(gray, (6, 4), None)
            
            if ret:
                self.obj_points.append(objp)
                corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)  # 在原角点的基础上寻找亚像素角点

                if [corners2]:
                    self.img_points.append(corners2)
                else:
                    self.img_points.append(corners)
                i+=1
                cv2.drawChessboardCorners(img, (6, 4), corners, ret)  # 记住,OpenCV的绘制函数一般无返回值
                cv2.imwrite(src_corner+fname.rsplit("\\",1)[1],img)
                # cv2.imwrite('./outimg/conimg'+str(i)+'.jpg', img)
                # cv2.waitKey(4000)
        if self.img_points:
            return True
        else:
                return False
    
    def get_parameter5(self,savesrc):
        # 保存相应5个标定参数,并存储
        self.savesrc5=savesrc
        self.ret, self.mtx, self.dist, self.rvecs, self.tvecs = cv2.calibrateCamera(self.obj_points, self.img_points,self.size, None, None)
        np.save(savesrc+ self.list1[0],self.ret)
        np.save(savesrc+ self.list1[1],self.mtx)
        np.save(savesrc+ self.list1[2],self.dist)
        np.save(savesrc+ self.list1[3],self.rvecs)
        np.save(savesrc+ self.list1[4],self.tvecs)
    def last_photo(self,imgsrc,src_par5,last_src):
        #imgsrc:原始影像路径
        #src_part5:5参数路径
        #last_src:最后保存路径
        #选择指定文件夹即可直接读入文件夹内保存的.npy数据,生成相片
        origin_images = glob.glob(imgsrc+'\*.[jp][pn]g')
        for tempfname in origin_images:
            tempimg=cv2.imread(tempfname)
            h,w=tempimg.shape[:2]
            # print(tempfname.rsplit("\\",1)[1])
            newcameramtx, roi=cv2.getOptimalNewCameraMatrix(np.load(src_par5+self.list1[1]+'.npy'),np.load(src_par5+self.list1[2]+'.npy'),(w,h),1,(w,h))#显示更大范围的图片(正常重映射之后会删掉一部分图像)
            print (newcameramtx)
            print("------------------使用undistort函数-------------------")
            temp_dst=cv2.undistort(tempimg,np.load(src_par5+self.list1[1]+'.npy'),np.load(src_par5+ self.list1[2]+'.npy'),None,newcameramtx)
            x,y,w,h = roi
            tempdst1 = temp_dst[y:y+h,x:x+w]
            cv2.imwrite(last_src+tempfname.rsplit("\\",1)[1], tempdst1)
            print ("方法一:dst的大小为:", tempdst1.shape)


if __name__ == '__main__':
    temp=Cphoto_pre_work()
    temp.get_grid('.\images4\*.jpg','./savecorner'+'/')
    srccc=r'E:\canshu'+'\\'
    temp.get_parameter5(srccc)
    temp.last_photo('.\images4',srccc,'./saveimg'+'/')

原始影像

原始影像
原始影像2

保存的参数

保留的参数

角点相连接的影像

角点连接图像

标定后影像

影像标定后
Github:https://github.com/Yiqingde/Batch-camera-calibration

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
相机标定是计算机视觉中的一个重要步骤,用于获取和校正相机内部参数和外部参数,以便于进行精确的三维重建或图像处理。Python有许多库支持相机标定,其中最常用的是OpenCV(Open Source Computer Vision Library)。 在Python中,相机标定通常涉及以下步骤: 1. **收集数据**:使用一个已知的校准图案(如棋盘格、环形或其他特殊图案)拍摄一组图片。 2. **读取和准备图像**:使用OpenCV的`cv2.imread()`函数读取图片,并进行预处理,例如灰度化、二值化等。 3. **查找特征点**:在预处理的图像上使用`findChessboardCorners()`函数寻找棋盘格角点。 4. **绘制并保存图像**:用角点标识图像,然后保存这些包含特征点信息的图片。 5. **进行标定**:调用`calibrateCamera()`函数,传入找到的角点和图像尺寸信息,计算相机矩阵、内参矩阵和平移向量。 6. **保存和验证结果**:保存标定参数到XML或CSV文件,并使用这些参数来纠正图像畸变。 以下是一个简化的Python代码示例,使用OpenCV进行相机标定: ```python import cv2 import numpy as np # 读取图像 images = [] corners = [] image_paths = ['path/to/image_1.jpg', 'path/to/image_2.jpg', ...] # 替换为你的图片路径列表 for path in image_paths: img = cv2.imread(path) images.append(img) corners.append(cv2.cornerSubPix(img, corners, (11, 11), (-1, -1), criteria)) # 标定相机 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(corners, images, images.shape[::-1], None, None) # 保存标定参数 cv2.destroyAllWindows() cv2.save('camera_matrix.xml', mtx) cv2.save('distortion_coefficients.xml', dist) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值