如何打印符合指定尺寸的Charuco板?打印尺寸不符的疑问
Charuco标定板打印尺寸偏差问题解答
核心结论
不是必须用PDF/SVG格式才能维持尺寸,但PNG作为位图,打印时易因缩放设置导致物理尺寸偏差;SVG/PDF这类矢量格式能更精准保证标定板实际尺寸,避免像素缩放误差。
为什么PNG打印尺寸不对
你当前代码生成固定600×600像素的PNG图,打印时系统会按设备DPI(每英寸像素数)自动缩放,不会直接对应你设置的0.05米/0.03米物理尺寸。比如用96DPI设备打印600像素边长的图,实际边长约6.25英寸(≈15.87厘米),和目标的0.15米(3×0.05米)偏差明显。
解决办法
方法1:调整PNG生成参数,匹配物理尺寸
通过计算将目标物理尺寸转换为对应DPI的像素数,步骤如下:
- 计算Charuco板总物理尺寸:3×3方块,每个0.05米,总宽/高=3×0.05=0.15米。
- 确定打印DPI(常用300DPI,保证打印清晰度)。
- 转换为像素数:
像素数 = 物理尺寸(米) × DPI ÷ 0.0254(0.0254为米与英寸的换算系数)。
修改后的代码示例:
import cv2 # 创建字典和Charuco板 d = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) charuco = cv2.aruco.CharucoBoard_create(3, 3, 0.05, 0.03, d) # 计算目标像素尺寸(按300DPI) dpi = 300 total_size_m = 3 * 0.05 total_pixels = int(total_size_m * dpi / 0.0254) # 生成并保存图像 img = charuco.draw((total_pixels, total_pixels)) cv2.imwrite("charuco_correct.png", img)
打印时选择**“实际尺寸”“不缩放”**选项,即可得到符合预期的物理尺寸。
方法2:使用SVG/PDF矢量格式
矢量图存储几何路径而非像素,打印时可直接指定物理尺寸,无缩放失真。OpenCV不支持直接生成SVG,可借助第三方库(如svgwrite)实现:
import svgwrite from svgwrite import mm dwg = svgwrite.Drawing('charuco.svg', profile='tiny') square_size = 50 # 50mm = 0.05m marker_size = 30 # 30mm = 0.03m squares_x, squares_y = 3, 3 # 绘制方块与标记(需替换标记为真实ArUco图案) for y in range(squares_y): for x in range(squares_x): # 白色方块 dwg.add(dwg.rect(insert=(x*square_size*mm, y*square_size*mm), size=(square_size*mm, square_size*mm), fill='white', stroke='black')) # 标记位置(方块中心) marker_pos = (x*square_size + (square_size - marker_size)/2, y*square_size + (square_size - marker_size)/2) # 示例:黑色矩形代替真实ArUco标记(需按字典生成对应黑白图案) dwg.add(dwg.rect(insert=(marker_pos[0]*mm, marker_pos[1]*mm), size=(marker_size*mm, marker_size*mm), fill='black')) dwg.save()
生成的SVG可直接按实际尺寸打印,无需调整缩放。
内容的提问来源于stack exchange,提问作者vacky
相关产品推荐
相关产品推荐

