OpenCV 4.10下ChArUco棋盘格相机标定无匹配点问题求助
OpenCV 4.10下ChArUco棋盘格相机标定无匹配点问题求助
我最近在用OpenCV和Python做相机标定,结果脚本死活找不到匹配点。为了排除其他干扰,我直接用带白色边框的ChArUco图案作为输入图像来测试,可还是连一个点都检测不到。下面是我写的可以直接运行的测试脚本:
import cv2 import numpy as np aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) board = cv2.aruco.CharucoBoard((5, 7),0.01, 0.008, aruco_dict) board.setLegacyPattern(True) b = board.generateImage((200,200),marginSize = 20) #image = cv2.imread('charuco_board.png') #gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = b # first detection aruco_detector = cv2.aruco.ArucoDetector(aruco_dict) marker_corners, marker_ids, rejected_candidates = aruco_detector.detectMarkers(image) print(marker_corners) # refine if marker_ids is not None: charuco_params = cv2.aruco.CharucoParameters() charuco_detector = cv2.aruco.CharucoDetector(board, charuco_params) charuco_corners, charuco_ids, _ = charuco_detector.detectBoard(gray, marker_corners, marker_ids) image_copy = image.copy() image_markers = cv2.aruco.drawDetectedMarkers(image_copy, marker_corners, marker_ids) image_charuco = cv2.aruco.drawDetectedCornersCharuco(image_markers, charuco_corners, charuco_ids) cv2.imshow('Detected ChArUco Corners', image_charuco) cv2.waitKey(0) cv2.destroyAllWindows() else: print("No corners detected.")
后来我排查发现,DICT_4X4_50这个字典好像有问题!换成DICT_6X6_250之后就能正常检测了,同时我还调整了生成图像的尺寸,修正了检测函数的参数传递方式。下面是可以正常运行的修正版脚本:
import cv2 import numpy as np aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250) board = cv2.aruco.CharucoBoard((5, 7),0.01, 0.008, aruco_dict) board.setLegacyPattern(True) b = board.generateImage((2000,2000),marginSize = 20) cv2.imwrite('charuco_board.png',b) gray = b # first detection aruco_detector = cv2.aruco.ArucoDetector(aruco_dict) marker_corners, marker_ids, rejected_candidates = aruco_detector.detectMarkers(b) print(marker_corners) # refine if marker_ids is not None: charuco_params = cv2.aruco.CharucoParameters() charuco_detector = cv2.aruco.CharucoDetector(board, charuco_params) #charuco_corners, charuco_ids, markerCorners, markerIds = charuco_detector.detectBoard(gray, marker_corners, marker_ids) charuco_corners, charuco_ids, markerCorners, markerIds = charuco_detector.detectBoard(gray) image_copy = b.copy() image_markers = cv2.aruco.drawDetectedMarkers(image_copy, marker_corners, marker_ids) image_charuco = cv2.aruco.drawDetectedCornersCharuco(image_markers, charuco_corners, charuco_ids) cv2.imshow('Detected ChArUco Corners', image_charuco) cv2.waitKey(0) cv2.destroyAllWindows() else: print("No corners detected.")
备注:内容来源于stack exchange,提问作者Bob8751
相关产品推荐
相关产品推荐

