未能检测到Zivid标定板
问题
Zivid SDK在手眼标定或现场标定/验证期间无法检测到棋盘格。
可能原因及解决方法
在使用 Zivid calibration board 时,基准/ArUco 标记必须在图像中可见。否则,在进行现场标定或手眼标定时,棋盘格检测会失败。在使用9x6灰白色棋盘时不需要这样做,因为它们上面没有基准标记。但是,我们建议使用标定板,因为这些板已经过Zivid的认证和单独验证。
Non-visible fiducial marker |
Visible fiducial marker |
小技巧
使用Zivid Studio检查捕获结果是否良好
请注意,如果函数无法检测到任何特征点,SDK 不会抛出错误。相反,它会返回一个空列表。原因是在点云中找不到棋盘格被认为是一个普通的操作失败而不是(异常)错误。因此,我们建议使用 valid()
运算符验证捕获后的检测结果。下面的代码说明了如何在程序中实现这一点。
const auto detectionResult = Zivid::Calibration::detectCalibrationBoard(frame);
if(detectionResult.valid())
{
std::cout << "Calibration board detected " << std::endl;
handEyeInput.emplace_back(robotPose, detectionResult);
currentPoseId++;
}
else
{
std::cout
<< "Failed to detect calibration board, ensure that the entire board is in the view of the camera"
<< std::endl;
}
var frame = Zivid.NET.Calibration.Detector.CaptureCalibrationBoard(camera);
var detectionResult = Detector.DetectCalibrationBoard(frame);
if (detectionResult.Valid())
{
Console.WriteLine("Calibration board detected");
handEyeInput.Add(new HandEyeInput(robotPose, detectionResult));
++currentPoseId;
}
else
{
Console.WriteLine("Failed to detect calibration board, ensure that the entire board is in the view of the camera");
}
frame = zivid.calibration.capture_calibration_board(camera)
detection_result = zivid.calibration.detect_calibration_board(frame)
if detection_result.valid():
print("Calibration board detected")
hand_eye_input.append(zivid.calibration.HandEyeInput(robot_pose, detection_result))
current_pose_id += 1
else:
print("Failed to detect calibration board, ensure that the entire board is in the view of the camera")