news 2026/4/15 21:56:28

Python+OpenCV实现棋盘格标定板生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+OpenCV实现棋盘格标定板生成

前言:在计算机视觉领域,相机标定是基础且关键的步骤,其目的是获取相机的内参矩阵和畸变系数,而棋盘格是最常用的标定模板。手动绘制棋盘格不仅繁琐,还容易出现尺寸不精准、格子不规整等问题,影响标定精度。本文将分享一个基于Python+OpenCV的棋盘格标定板生成工具,支持自定义规格,一键生成可直接打印的标定板,新手也能轻松上手。

一、工具核心功能

  • 默认生成A4尺寸棋盘格,支持自定义纸张尺寸(需少量修改代码)

  • 可自由设置X/Y方向内角点数量、单个方格尺寸(毫米)

  • 支持自定义图片分辨率(DPI),保证打印清晰度

  • 自动居中绘制棋盘格,添加边框,生成后自动输出详细参数信息

  • 支持自定义输出路径,未指定时自动保存到脚本所在目录

二、环境准备

本工具依赖两个核心Python库:OpenCV(用于图像处理)和numpy(用于数组运算),安装命令如下:

pip install opencv-python numpy

安装完成后,可通过以下代码验证是否安装成功:

import cv2 import numpy as np print("OpenCV版本:", cv2.__version__) print("numpy版本:", np.__version__)

import cv2 import numpy as np print("OpenCV版本:", cv2.__version__) print("numpy版本:", np.__version__)

若未报错且正常输出版本号,则环境配置完成。

三、完整代码展示

直接复制以下代码,保存为create_a4_board.py文件即可使用:

#!/usr/bin/env python3 import cv2 import numpy as np import os import argparse from pathlib import Path def create_checkerboard(width_mm, height_mm, squares_x, squares_y, square_size_mm, dpi=300, output_path=None): """ 创建指定尺寸的棋盘格标定板 参数: width_mm: 纸张宽度(毫米) height_mm: 纸张高度(毫米) squares_x: X方向内角点数量 squares_y: Y方向内角点数量 square_size_mm: 每个方格的大小(毫米) dpi: 输出图片的分辨率 output_path: 输出文件路径,默认None(自动生成) """ # 计算像素尺寸 width_pixels = int(width_mm * dpi / 25.4) height_pixels = int(height_mm * dpi / 25.4) square_size_pixels = int(square_size_mm * dpi / 25.4) # 计算棋盘格的实际像素尺寸 board_width_pixels = squares_x * square_size_pixels board_height_pixels = squares_y * square_size_pixels # 计算棋盘格在图像中的居中位置 offset_x = (width_pixels - board_width_pixels) // 2 offset_y = (height_pixels - board_height_pixels) // 2 # 创建白色背景 image = np.ones((height_pixels, width_pixels), dtype=np.uint8) * 255 # 绘制棋盘格 for i in range(squares_y): for j in range(squares_x): # 棋盘格起始颜色为黑色(左上角) if (i + j) % 2 == 0: # 计算每个方格的像素位置 x1 = offset_x + j * square_size_pixels y1 = offset_y + i * square_size_pixels x2 = x1 + square_size_pixels y2 = y1 + square_size_pixels # 确保不超出图像边界 x1 = max(0, x1) y1 = max(0, y1) x2 = min(width_pixels, x2) y2 = min(height_pixels, y2) # 填充黑色 image[y1:y2, x1:x2] = 0 # 添加边框(可选) border_size = 1 if border_size > 0: image[:border_size, :] = 0 image[-border_size:, :] = 0 image[:, :border_size] = 0 image[:, -border_size:] = 0 # 如果未指定输出路径,自动生成 if output_path is None: # 获取脚本所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 生成文件名 filename = f"a4_board.jpg" output_path = os.path.join(script_dir, filename) # 确保输出目录存在 os.makedirs(os.path.dirname(output_path), exist_ok=True) # 保存图像 cv2.imwrite(output_path, image) print(f"\n棋盘格标定板生成完成!") print(f"规格: {squares_x}x{squares_y} 内角点 ({(squares_x+1)}x{(squares_y+1)} 方格)") print(f"方格大小: {square_size_mm} mm") print(f"纸张尺寸: {width_mm}x{height_mm} mm (A4)") print(f"分辨率: {dpi} DPI") print(f"图像尺寸: {width_pixels}x{height_pixels} 像素") print(f"保存路径: {output_path}") print(f"\n注意事项:") print(f"1. 打印时请确保在打印设置中选择'实际大小'或'100%缩放'选项") print(f"2. 建议使用高质量的打印机和纸张") print(f"3. 打印后使用尺子测量方格大小进行验证") return image, output_path def main(): # 创建参数解析器 parser = argparse.ArgumentParser(description='生成A4大小的棋盘格标定板') # A4尺寸默认值(毫米) a4_width_mm = 210 a4_height_mm = 297 # 添加命令行参数 parser.add_argument('--squares-x', type=int, default=6, help='X方向内角点数量(默认:6)') parser.add_argument('--squares-y', type=int, default=9, help='Y方向内角点数量(默认:9)') parser.add_argument('--square-size', type=int, default=25, help='每个方格的大小(毫米,默认:25)') parser.add_argument('--dpi', type=int, default=300, help='输出图片的分辨率(默认:300 DPI)') parser.add_argument('--output', type=str, default=None, help='输出文件路径(默认:自动生成)') # 解析参数 args = parser.parse_args() # 打印程序信息 print("="*60) print(" 棋盘格标定板生成器 (A4尺寸) ") print("="*60) # 创建棋盘格 create_checkerboard( width_mm=a4_width_mm, height_mm=a4_height_mm, squares_x=args.squares_x, squares_y=args.squares_y, square_size_mm=args.square_size, dpi=args.dpi, output_path=args.output ) print("="*60) if __name__ == "__main__": # 检查是否安装了OpenCV try: import cv2 except ImportError: print("错误: 未安装OpenCV库") print("请使用以下命令安装: pip install opencv-python numpy") exit(1) main()

代码运行结果如下,生成了一张棋盘格图片:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 21:58:02

Arduino平台下L298N电机驱动模块全面讲解

从零玩转L298N:Arduino驱动直流电机的实战全指南你有没有试过用Arduino直接带一个轮子转动的小车?结果一通电,Arduino“啪”一下重启了——或者电机纹丝不动,芯片却烫得能煎蛋?这几乎是每个创客、电子爱好者甚至工程科…

作者头像 李华
网站建设 2026/4/16 9:19:38

飞书多维表格vsTeable 如何选?把握“内外兼修”是关键决策点

在数字化转型的浪潮中,企业如何选择适合自身的多维表格平台,已成为提升管理效率和协同能力的关键决策。面对市场上众多的选择,飞书多维表格和Teable无疑是两个备受关注的选项。而在这场选择中,“内外兼修”的理念或许能为我们指明…

作者头像 李华
网站建设 2026/4/16 9:18:53

企业级家电销售展示平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着互联网技术的快速发展和智能家居市场的持续扩张,传统家电销售模式已无法满足消费者对便捷性、个性化和高效服务的需求。企业级家电销售展示平台管理系统应运而生,旨在通过数字化手段整合家电销售的全流程,提升用户体验和运营效率。该…

作者头像 李华
网站建设 2026/4/16 9:21:34

LangFlow商业计划书执行摘要生成器

LangFlow商业计划书执行摘要生成器 在创业项目密集孵化的今天,一份打动投资人的商业计划书执行摘要是融资成败的关键。然而,大多数技术背景出身的创始人并不擅长用精炼语言讲好“故事”——既要突出创新性,又要体现商业模式可行性&#xff0c…

作者头像 李华
网站建设 2026/4/16 7:06:28

DM 数据库学习心得:从安装到实操的全流程实践

一、学习背景与初衷​ 随着国产数据库技术的崛起,达梦(DM)数据库作为自主研发的核心产品,在政务、金融等领域的应用日益广泛。通过《国产数据库技术》课程学习,我从零基础逐步掌握 DM 数据库的核心操作,本…

作者头像 李华
网站建设 2026/4/16 7:03:30

OpenPLC与Arduino硬件资源匹配深度解析

OpenPLC Arduino:如何让一块5美元开发板变身工业级控制器?你有没有想过,手边那块用于点亮LED、读取温湿度的Arduino Uno,其实可以摇身一变,成为一台真正的可编程逻辑控制器(PLC)?不…

作者头像 李华