运行现场标定
介绍
如需在相机上运行现场验证和/或校正,您可以使用:
Zivid Studio
命令行工具(CLI)
SDK
小技巧
如果您是第一次运行现场标定,我们建议使用Zivid Studio。
现场标定功能概述
Last correction 显示最近一次现场标定写入相机的日期和时间。
Capture & Measure 捕获图像以确定放置了Zivid标定板的区域的点云局部尺寸准确度。
Current Camera Metrics 显示最近一次使用 Capture & Measure 捕获的点云的局部尺寸准确度,以及所有捕获的平均值和最大值。
Current trueness 显示最近一次使用 Capture & Measure 捕获的点云的局部尺寸准确度。
Average trueness 显示到目前为止使用 Capture & Measure 进行的所有捕获的局部尺寸准确度误差的平均值。
Maximum trueness 显示到目前为止使用 Capture & Measure 进行的所有捕获的局部尺寸准确度误差的最大值。
Expected Post-Correction Metrics 显示在拍摄图像的工作距离上的1σ(标准差)统计学不确定性内的估计的校正后的误差。
Save Correction to Camera 将参数写入相机,以提高点云的精度,这些点云是通过 Capture & Measure 拍摄的Zivid标定板确定的。
Reset Camera Correction 删除在之前的正确实例中应用的任何现场标定结果。在进行新的现场标定之前不需要进行重置。
DESCRIPTION
Tool for verifying, computing and updating infield correction parameters on a Zivid camera
SYNOPSIS
ZividExperimentalInfieldCorrection.exe (verify|correct|read|reset) [-h]
OPTIONS
verify verify camera correction quality based on a single capture
correct calculate infield correction based on a series of captures at different distances and positions
read get information about the correction currently on the connected camera
reset reset correction on connected camera to factory settings
如果在安装期间将Zivid安装到自定义路径,则CLI工具也位于该路径下,否则,CLI工具位于 C:\Program Files\Zivid\bin
下。
CLI工具位于主路径中。
verify :此功能使用单次捕获来确定放置的Zivid标定板点云的局部尺寸真实度。
correct :此功能通过拍摄Zivid标定板来确定必要的参数,以提高点云的精度。该功能还将返回在拍摄图像的工作距离上的1σ(标准差)统计不确定性内的校正后的误差。
reset : 使用重置功能将删除之前正确应用的现场标定的结果。 在进行新的现场标定之前不需要进行重置。
read :读取功能将返回上一次将现场标定结果写入相机的时间。
Verify(验证)
将标定板放置需要验证的位置。我们建议使用Zivid Studio的实时(live)捕获模式来观察捕获情况以正确地对齐标定板。将棋盘格放置在您想要成像的区域中最近距离处,作为现场标定数据集的第一次捕获。使标定板尽可能地平行于相机坐标系,并确保整个标定板在相机坐标系中可见。
然后,打开现场标定工具(Infield Correction)。在工具栏中,单击 Tools → Infield Correction 。
单击 Capture & Measure 以验证所连接相机的局部尺寸准确度。
结果将显示在 Current Camera Metrics 下:
使用命令行运行带有输入参数 verify
的验证功能(不要忘记在Zivid Studio中断开与相机的连接):
ZividExperimentalInfieldCorrection verify
可能发生的问题
如果标定板偏离方向太远或捕获质量太差导致无法提供足够的数据,您将被告知存在潜在的设置问题:
标定板在X、Y或Z平面上过于倾斜。
并非所有特征点都是可检测的。
基准标记不可见。
标定板的图像质量太差,无法提供足够的数据。
如需通过SDK验证相机的局部尺寸准确度,首先需要连接到相机(不要忘记在Zivid Studio中断开与相机的连接)。
std::cout << "Connecting to camera" << std::endl;
auto camera = zivid.connectCamera();
print("Connecting to camera")
camera = app.connect_camera()
然后,通过捕获Zivid标定板来收集数据。
std::cout << "Capturing calibration board" << std::endl;
const auto detectionResult = Zivid::Experimental::Calibration::detectFeaturePoints(camera);
print("Capturing calibration board")
detection_result = calibration.detect_feature_points(camera)
Verify from ZDF file
Why is verifying camera accuracy from a ZDF file useful?
Let us assume that your system is in production. You want to verify the accuracy of the camera while the system is running. At the same time, you want to minimize the time the robot and the camera are used for anything else than their main task, e.g., bin picking. Instead of running a full infield verification live, which consists of capturing, detecting, and estimating accuracy, you can instead only capture and save results to ZDF files on disk. As the robot and the camera go back to their main tasks, you can load the ZDF files and verify the accuracy offline, using a different PC than the one used in production. In addition, you can send these ZDF files to Zivid Customer Success for investigation.
To verify the camera accuracy from ZDF files, first capture the calibration board.
std::cout << "Capturing calibration board" << std::endl;
const auto frame = Zivid::Experimental::Calibration::captureCalibrationBoard(camera);
Then, save the frame to disk.
const auto dataFile = "FrameWithCalibrationBoard.zdf";
frame.save(dataFile);
Load the frame from a ZDF file.
std::cout << "Reading frame from file: " << dataFile << ", for offline infield verification" << std::endl;
const auto loadedFrame = Zivid::Frame(dataFile);
Then, detect the calibration board feature points from the frame.
std::cout << "Detecting calibration board" << std::endl;
const auto detectionResult = Zivid::Experimental::Calibration::detectFeaturePoints(loadedFrame);
备注
A frame captured with captureCalibrationBoard(camera)
is not the same as a frame resulting from capture(camera)
.
The function detectFeaturePoints
only supports frame objects returned from captureCalibrationBoard(camera)
function.
之后,准备数据并检查它是否适合现场验证。
const auto input = Zivid::Experimental::Calibration::InfieldCorrectionInput{ detectionResult };
if(!input.valid())
{
throw std::runtime_error(
"Capture not valid for infield verification! Feedback: " + input.statusDescription());
}
infield_input = calibration.InfieldCorrectionInput(detection_result)
if not infield_input.valid():
raise RuntimeError(
f"Capture not valid for infield verification! Feedback: {infield_input.status_description()}"
)
最后显示验证结果。
std::cout << "Successful measurement at " << detectionResult.centroid() << std::endl;
const auto verification = Zivid::Experimental::Calibration::verifyCamera(input);
std::cout << "Estimated dimension trueness at measured position: " << std::setprecision(2) << std::fixed
<< verification.localDimensionTrueness() * 100.0F << "%" << std::endl;
print(f"Successful measurement at {detection_result.centroid()}")
camera_verification = calibration.verify_camera(infield_input)
print(
f"Estimated dimension trueness at measured position: {camera_verification.local_dimension_trueness()*100:.3f}%"
)
可能发生的问题
如果标定板偏离方向太远或捕获质量太差导致无法提供足够的数据,您将被告知存在潜在的设置问题:
标定板在X、Y或Z平面上过于倾斜。
并非所有特征点都是可检测的。
基准标记不可见。
标定板的图像质量太差,无法提供足够的数据。
Correct(校正)
在相机上执行现场标定时,请在FOV中的不同距离和不同位置单击 Capture & Measure 来收集数据,如同 进行现场标定的准则 中所描述的那样。
当您进行现场标定捕获时,您将看到给定捕获次数的预期尺寸精度(如果您要应用校正)。
完成此过程返回的信息包括:
最新计算出的FOV大部分区域的最大尺寸真实度误差。
该误差的范围取决于拍摄校正图像的距离。
如果对校正的结果满意,请选择将校正参数应用于相机。
备注
Expected Post-Correction Metrics 的值大于 Camera Metrics 下的值并非异常。这是因为 Expected Post-Correction Metrics 是根据现场校正数据集中使用的大部分FOV和距离范围给出的。另一方面, Camera Metrics 是根据标定板所覆盖的FOV以及与标定板的距离的捕获而计算出的*局部*尺寸准确度误差。
最后,通过单击 Save Correction to Camera 在相机上应用现场校正结果。
使用命令行运行带有输入参数 correct
的校正功能(不要忘记在Zivid Studio中断开与相机的连接):
ZividExperimentalInfieldCorrection correct
可能发生的问题
如果标定板偏离方向太远或捕获质量太差导致无法提供足够的数据,您将被告知存在潜在的设置问题:
标定板在X、Y或Z平面上过于倾斜。
并非所有特征点都是可检测的。
基准标记不可见。
标定板的图像质量太差,无法提供足够的数据。
备注
预期的校正后尺寸精度值大于每次捕获测量的值并不意外。这是因为预期的校正后指标是根据现场校正数据集中使用的大部分FOV和距离范围计算出来的。另一方面,捕获测量值是根据标定板覆盖的FOV和与板的距离的捕获计算出的*局部*尺寸准确度误差。
通过SDK对相机执行现场标定时,首先需要连接到相机(不要忘记在Zivid Studio中断开与摄像机的连接)。
std::cout << "Connecting to camera" << std::endl;
auto camera = zivid.connectCamera();
print("Connecting to camera")
camera = app.connect_camera()
然后,将相机对准Zivid标定板并收集数据以进行现场校正。
std::vector<Zivid::Experimental::Calibration::InfieldCorrectionInput> dataset;
std::cout << "Please point the camera at a Zivid infield calibration board. " << std::endl;
const std::string printLine = "------------------------------------------------------------------------";
while(true)
{
std::cout << printLine << std::endl;
if(yesNoPrompt("Capture (y) or finish (n)?"))
{
std::cout << "Capturing calibration board" << std::endl;
const auto detectionResult = Zivid::Experimental::Calibration::detectFeaturePoints(camera);
const auto input = Zivid::Experimental::Calibration::InfieldCorrectionInput{ detectionResult };
if(input.valid())
{
dataset.emplace_back(input);
std::cout << "Valid measurement at: " << input.detectionResult().centroid() << std::endl;
}
else
{
std::cout << "****INVALID****" << std::endl;
std::cout << "Feedback: " << input.statusDescription() << std::endl;
}
std::cout << printLine << std::endl;
}
else
{
std::cout << "End of capturing stage." << std::endl;
std::cout << printLine << std::endl;
break;
}
std::cout << "You have collected " << dataset.size() << " valid measurements so far." << std::endl;
}
dataset = []
print("Please point the camera at a Zivid infield calibration board. ")
print_line = "------------------------------------------------------------------------"
while True:
print(print_line)
if _yes_no_prompt("Capture (y) or finish (n)? "):
print("Capturing calibration board")
detection_result = calibration.detect_feature_points(camera)
infield_input = calibration.InfieldCorrectionInput(detection_result)
if infield_input.valid():
dataset.append(infield_input)
else:
print("****INVALID****")
print(f"Feedback: {infield_input.status_description()}")
print(print_line)
else:
print("End of capturing stage.")
print(print_line)
break
print(f"You have collected {len(dataset)} valid measurements so far.")
std::cout << "Computing new camera correction..." << std::endl;
const auto correction = Zivid::Experimental::Calibration::computeCameraCorrection(dataset);
print("Computing new camera correction...")
correction = calibration.compute_camera_correction(dataset)
在应用新的标定数据之前,请先估计新校正的预期尺寸精度。
const auto accuracyEstimate = correction.accuracyEstimate();
std::cout
<< "If written to the camera, this correction can be expected to yield a dimension accuracy of "
<< std::fixed << std::setprecision(2) << 100.0F * accuracyEstimate.dimensionAccuracy()
<< "% or better in the range of z=[" << static_cast<int>(std::round(accuracyEstimate.zMin())) << ","
<< static_cast<int>(std::round(accuracyEstimate.zMax()))
<< "] across the full FOV. Accuracy close to where the correction data was collected is likely better."
<< std::endl;
accuracy_estimate = correction.accuracy_estimate()
print(
"If written to the camera, this correction can be expected to yield a dimension accuracy of ",
f"{accuracy_estimate.dimension_accuracy()*100:.3f} or better in the range of z=[{accuracy_estimate.z_min():.3f}, {accuracy_estimate.z_max():.3f}] across the full FOV.",
"Accuracy close to where the correction data was collected is likely better.",
)
完成此过程返回的信息包括:
最新计算出的FOV大部分区域的最大尺寸真实度误差。
该误差的范围取决于拍摄校正图像的距离。
如果对校正的结果满意,请选择将校正参数应用于相机。
备注
预期的校正后尺寸精度值大于每次捕获测量的值并不意外。这是因为预期的校正后指标是根据现场校正数据集中使用的大部分FOV和距离范围计算出来的。另一方面,捕获测量值是根据标定板覆盖的FOV和与板的距离的捕获计算出的*局部*尺寸准确度误差。
最后,在相机上应用现场校正结果。
std::cout << "Writing camera correction..." << std::endl;
Zivid::Experimental::Calibration::writeCameraCorrection(camera, correction);
print("Writing correction to camera")
calibration.write_camera_correction(camera, correction)
可能发生的问题
如果标定板偏离方向太远或捕获质量太差导致无法提供足够的数据,您将被告知存在潜在的设置问题:
标定板在X、Y或Z平面上过于倾斜。
并非所有特征点都是可检测的。
基准标记不可见。
标定板的图像质量太差,无法提供足够的数据。
Read(读取)
可以查看最后一次校正写入相机的日期和时间。
使用输入参数 read
来查看最后一次校正何时应用于相机。
ZividExperimentalInfieldCorrection read
使用读取功能查看上次对相机应用校正的时间。
if(Zivid::Experimental::Calibration::hasCameraCorrection(camera))
{
const auto timestamp = Zivid::Experimental::Calibration::cameraCorrectionTimestamp(camera);
const auto time = std::chrono::system_clock::to_time_t(timestamp);
std::cout << "Timestamp of current camera correction: " << std::put_time(std::gmtime(&time), "%FT%TZ")
<< std::endl;
}
else
{
std::cout << "This camera has no infield correction written to it." << std::endl;
}
if calibration.has_camera_correction(camera):
timestamp = calibration.camera_correction_timestamp(camera)
print(f"Timestamp of current camera correction: {timestamp.strftime(r'%Y-%m-%d %H:%M:%S')}")
else:
print("This camera has no infield correction written to it.")
Reset(重置)
可以删除已应用于相机的校正结果。在测试和应用新的校正之前,没有必要删除校正结果。
使用输入参数 reset
来删除已应用于相机的校正结果。
ZividExperimentalInfieldCorrection reset
使用重置功能删除已应用于相机的校正结果。
std::cout << "Reset infield correction on the camera" << std::endl;
Zivid::Experimental::Calibration::resetCameraCorrection(camera);
print("Reset infield correction on the camera")
calibration.reset_camera_correction(camera)
备注
Zivid在新相机发货前已对其进行了现场标定。该重置功能也会清除该校正结果,将相机重置为仅具有出厂标定的状态。我们建议您在您的环境中进行现场标定以获得最佳的性能。