TLDR:目前在线的许多 Charuco 示例代码都已过时,并且会让你出错。如果 ChatGPT 或 Stack Exchange 建议你使用:
cv2.aruco.CharucoBoard_create(length, width, ...)
你会发现正确的语法是cv2.aruco.CharucoBoard((length, width), ...)
。希望下面的示例函数能有所帮助。
如果你之前使用过OpenCV,你可能熟悉我们用于校准相机的经典棋盘格。你可能也熟悉Aruco标记,它们用于机器人应用中的姿态估计。这些标记带有唯一标识符,类似于棋盘格,我们可以使用其角点来确定其坐标框架。Charuco棋盘是将它们结合到一个棋盘上的有用方式,如图所示。
这使我们能够唯一地识别棋盘的每个角。识别唯一的角点有两个原因:
棋盘的一部分被遮挡时无法检测到,但Charuco棋盘不受此影响。
识别角点可以帮助我们更准确地描述棋盘的坐标框架。
自从一些更新的 OpenCV 版本(撰写本文时最新版本为 4.8.0)以来,Aruco 库发生了一些相当重大的变化 - 目前你在网上发现的大部分代码已经过时。希望本指南将提供更新的演练,并向你展示我如何使用 Charuco 棋盘进行图像校正和姿势估计(对于标准棋盘来说这是一项艰巨的任务)。
确保你正在运行最新版本的Python,还有OpenCV的contrib版本。这一步非常重要,因为它为我们提供了正确的库:
pip install opencv-contrib-python
使用“contrib”版本来访问该库非常重要,并确保不要安装无界面版本(它会阻止 GUI 出现)。如果你在尝试运行任何 Aruco 或 ChAruco 库函数时遇到错误,则可能是你的安装出现错误。
接下来,你可以开始编写脚本。
创建Charuco棋盘
最好的起点是为自己创建一个 Charuco 棋盘。以下脚本将帮助你根据你的要求创建一个棋盘。该图像将显示两秒钟,然后保存到当前文件夹中。
import os
import numpy as np
import cv2
# ------------------------------
# ENTER YOUR PARAMETERS HERE:
ARUCO_DICT = cv2.aruco.DICT_6X6_250
SQUARES_VERTICALLY = 7
SQUARES_HORIZONTALLY = 5
SQUARE_LENGTH = 0.03
MARKER_LENGTH = 0.015
LENGTH_PX = 640 # total length of the page in pixels
MARGIN_PX = 20 # size of the margin in pixels
SAVE_NAME = 'ChArUco_Marker.png'
# ------------------------------
def create_and_save_new_board():
dictionary = cv2.aruco.getPredefinedDictio