未能检测到Zivid标定板

问题

Zivid SDK在手眼标定或现场标定/验证期间无法检测到棋盘格。

可能原因及解决方法

在使用 Zivid calibration board 时,基准/ArUco 标记必须在图像中可见。否则,在进行现场标定或手眼标定时,棋盘格检测会失败。在使用9x6灰白色棋盘时不需要这样做,因为它们上面没有基准标记。但是,我们建议使用标定板,因为这些板已经过Zivid的认证和单独验证。

fig_bad_he

fig_good_he

Non-visible fiducial marker

Visible fiducial marker

小技巧

使用Zivid Studio检查捕获结果是否良好

请注意,如果函数无法检测到任何特征点,SDK 不会抛出错误。它会返回一个空列表。原因是在点云中找不到棋盘格被认为是一个普通的操作失败而不是(异常)错误。因此,我们建议使用 valid() 运算符验证捕获后的检测结果。下面的代码说明了如何在程序中实现这一点。

跳转到源码

源码

const auto detectionResult = Zivid::Calibration::detectFeaturePoints(frame.pointCloud());

if(detectionResult.valid())
{
    std::cout << "Calibration board detected " << std::endl;
    handEyeInput.emplace_back(Zivid::Calibration::HandEyeInput{ 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 detectionResult = Detector.DetectFeaturePoints(frame.PointCloud);

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");
}
跳转到源码

源码

detection_result = zivid.calibration.detect_feature_points(frame.point_cloud())

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"
    )