Failed to detect Zivid calibration board

Problem

Zivid SDK는 Hand-Eye Calibration 또는 Infield Correction/Verification 중에 체커보드를 감지할 수 없습니다.

Possible causes and solutions

Zivid calibration board 를 사용하는 경우 기준점/ArUco 마커가 이미지에 표시되어야 합니다. 그렇지 않으면 Infield Correction 또는 Hand-Eye Calibration을 수행할 때 체커보드 감지가 실패합니다. 9x6 회색-흰색 체커보드을 사용할 때는 기준 마커를 사용하지 않기 때문에 필요하지 않습니다. 그러나 Zivid에서 검증되고 개별적으로 검증된 Calibration Board를 사용하는 것을 추천합니다.

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;
}
소스로 이동

source

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");
}
소스로 이동

source

detection_result = zivid.experimental.calibration.detect_feature_points(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"
    )