python相机标定

python相机标定,第1张

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

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

# -*- Coding: utf-8 -*-from cv2 import cv2import numpy as npimport globclass 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'+'/')
总结

以上是内存溢出为你收集整理的python相机标定全部内容,希望文章能够帮你解决python相机标定所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1188166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存