根据棋盘格标定板的尺寸和格子数量、大小修改程序

#标定命令 python3 cal.py --image_size 1280x720 --corner 11x8 --square 30import os
import cv2 as cv
import numpy as np
import glob
import xml.etree.ElementTree as ET
import argparseclass CameraCalibrator(object):def __init__(self, image_size:tuple):super(CameraCalibrator, self).__init__()self.image_size = image_sizeself.matrix = np.zeros((3, 3), np.float)self.new_camera_matrix = np.zeros((3, 3), np.float)self.dist = np.zeros((1, 5))self.roi = np.zeros(4, np.int)def save_params(self, save_path='camera_params.xml'):root = ET.Element('root')tree = ET.ElementTree(root)mat_node = ET.Element('camera_matrix')root.append(mat_node)for i, elem in enumerate(self.matrix.flatten()):child = ET.Element('data{}'.format(i))child.text = str(elem)mat_node.append(child)dist_node = ET.Element('camera_distortion')root.append(dist_node)for i, elem in enumerate(self.dist.flatten()):child = ET.Element('data{}'.format(i))child.text = str(elem)dist_node.append(child)tree.write(save_path, 'UTF-8')print("Saved params in {}.".format(save_path))def cal_real_corner(self, corner_height, corner_width, square_size):obj_corner = np.zeros([corner_height * corner_width, 3], np.float32)obj_corner[:, :2] = np.mgrid[0:corner_height, 0:corner_width].T.reshape(-1, 2)  # (w*h)*2return obj_corner * square_sizedef calibration(self, corner_height:int, corner_width:int, square_size:float):file_names = glob.glob('./chess/*.JPG') + glob.glob('./chess/*.jpg') + glob.glob('./chess/*.png')objs_corner = []imgs_corner = []criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001)obj_corner = self.cal_real_corner(corner_height, corner_width, square_size)for file_name in file_names:# read imagechess_img = cv.imread(file_name)assert (chess_img.shape[0] == self.image_size[1] and chess_img.shape[1] == self.image_size[0]), \"Image size does not match the given value {}.".format(self.image_size)# to graygray = cv.cvtColor(chess_img, cv.COLOR_BGR2GRAY)# find chessboard cornersret, img_corners = cv.findChessboardCorners(gray, (corner_height, corner_width))# append to img_cornersif ret:objs_corner.append(obj_corner)img_corners = cv.cornerSubPix(gray, img_corners, winSize=(square_size//2, square_size//2),zeroZone=(-1, -1), criteria=criteria)imgs_corner.append(img_corners)else:print("Fail to find corners in {}.".format(file_name))# calibrationret, self.matrix, self.dist, rvecs, tveces = cv.calibrateCamera(objs_corner, imgs_corner, self.image_size, None, None)print(self.matrix)return retdef rectify_image(self, img):if not isinstance(img, np.ndarray):AssertionError("Image type '{}' is not numpy.ndarray.".format(type(img)))dst = cv.undistort(img, self.matrix, self.dist, self.new_camera_matrix)x, y, w, h = self.roidst = dst[y:y + h, x:x + w]dst = cv.resize(dst, (self.image_size[0], self.image_size[1]))return dstif __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--image_size', type= str, help='width*height of image')parser.add_argument('--square', type=int, help='size of chessboard square, by mm')parser.add_argument('--corner', type=str, help='width*height of chessboard corner')args = parser.parse_args()calibrator = Nonetry:image_size = tuple(int(i) for i in args.image_size.split('x'))calibrator = CameraCalibrator(image_size)except:print("Invalid/Missing parameter: --image_size. Sample: \n\n""    --image_size 1920*1080\n")exit(-1)if not args.corner or not args.square:print("Missing parameters of corner/square. Using: \n\n""    --corner <width>x<height>\n\n""    --square <length of square>\n")exit(-1)corner = tuple(int(i) for i in args.corner.split('x'))if calibrator.calibration(corner[1], corner[0], args.square):calibrator.save_params()else:print("Calibration failed.")

python棋盘格标定程序相关推荐

  1. 计算机视觉——棋盘格标定法获取相机内参外参

    计算机视觉--棋盘格标定法获取相机内参外参 一.原理 相机标定目的 相机标定的输入 相机标定的输出 相机标定策略 相机拍摄图像变换过程 相机内参 相机外参 二.环境 三.数据集 四.运行结果与分析 角 ...

  2. python相机标定流程图_相机标定——OpenCV-Python Tutorials

    目标 我们将了解导致相机失真.扭曲的内因与外因 我们将试着找到这些畸变参数,并消除畸变 基础 如今大量廉价的摄像机导致了很多照片畸变.两个主要的畸变是径向畸变和切向畸变. 由于径向畸变,直线会变弯.距 ...

  3. 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

    from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...

  4. 相机标定与棋盘格标定

    文章目录 1.相机标定 1.1 相机标定介绍 1.2 相机标定的意义 1.3 相机标定方法 1.4 相机标定的用途 2.相机参数 2.1 内参 2.2 外参 2.3 畸变参数 3.棋盘格标定 3.1 ...

  5. opencv c++实现棋盘格标定

    程序流程 准备好一系列用来相机标定的图片: 对每张图片提取角点信息: 由于角点信息不够精确,进一步提取亚像素角点信息: 在图片中画出提取出的角点: 相机标定: 对标定结果评价,计算误差: 使用标定结果 ...

  6. python 手眼标定OpenCV手眼标定(calibrateHandeye())一

    以下代码来源 本篇博客通过该代码,附上记录的公式与查找连接,方面以后调用能弄懂各个参数的意思 本篇看完看第二篇代码踩坑部分python 手眼标定OpenCV手眼标定(calibrateHandeye( ...

  7. 利用OpenCv程序生成棋盘格标定板,并且实现像素单位与米制单位的转换

    /********************************************************************************************* 程序功能: ...

  8. python网络爬虫程序技术,Python网络爬虫程序技术

    spContent=该课程是2018年广东省精品在线开放课程.课程主要以爬取学生信息.爬取城市天气预报.爬取网站图像.爬起图书网站图书.爬取商城网站商品等5个项目为依托,讲解Web.正则表达式.Bea ...

  9. python缩进在程序中长度统一且强制使用_Python习题纠错1

    February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...

最新文章

  1. MIT工程师利用人工大脑突触(忆阻器)设计了“脑芯片“,未来可用于便携式设备
  2. 全球五大顶级域名一周统计:7月第三周新增超9万个
  3. 天天向上续python3.3_Linux 配置系列 四 python3
  4. 域名使用cname方式跳转不到新域名_七牛云图床和Markdown使用
  5. 批量数据替换助手V2.0版发布,欢迎使用
  6. VS2015 程序运行时系统找不到指定文件
  7. 计算机网络之物联网的特点及其主要应用领域
  8. java 取磁盘阵列容量_硬盘阵列 Raid 的区别及容量计算方式
  9. IndexError: list index out of range 错误原理及解决方法(python)
  10. java 简单的聊天室_Java简单聊天室
  11. SQL注入绕过(passby)策略
  12. word中选择单倍行距,但是有些段落的行距还是不一样
  13. 耳朵经济下,有声读物的加与减
  14. 【java8 stream操作List集合】
  15. AI之路(二)——关于统计学习(statistical learning)Part 1 概论
  16. Photoshop如何快速选择定位到锁定状态的图层
  17. 基于Matlab的天线阵列综合 微波与电磁场 计算成像 波束赋形 相控阵 阵列天线设计
  18. web前端知识集合——javascript基础篇之javascript背景历史和运行环境(一)
  19. 会声会影2022最高版中文原程序新试用版
  20. 带你全面了解 Flutter,它好在哪里?它的坑在哪里? 应该怎么学?

热门文章

  1. ssd [Error] UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position【已解决】
  2. 科普系列:AUTOSAR与OSEK网络管理比较(下)
  3. memcpy、memmove、memcmp、memset函数的使用说明和模拟实现
  4. 格基规约算法:数学基础
  5. 迎风面投影指数迎风面密度计算工具及计算实例经验分享
  6. TextView自动调节字体大小
  7. 小博无线技术团队使用的编程语言
  8. 基于LSB的信息隐藏
  9. python枚举是什么意思_什么是枚举python,
  10. sqlserver中的常见函数用法