让代码更简单

VisionPro N点标定N-Point Calibration

重要:本文最后更新于2020-09-22 17:17:25,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

在视觉应用程序中,通常需要将采集图像中对象的测量值和位置与有意义的真实值关联起来。你可以通过校准你的视觉系统来完成。校准是一个计算二维转换的过程,它将图像坐标映射到真实世界坐标,并将计算的变换附加到输入图像。此过程适用于整个相机图像或世界视图,消除相机纵横比和镜头失真。

在VisionPro中,可以使用CogCalibNPointToNPointTool校准系统。此工具接受两组N点,一组在未校准空间中指定,另一组在原始校准空间中指定,以及最终校准空间的可选原点调整。在训练时间,该工具确定一个最佳拟合的二维变换,将输入图像(未标定的空间点)中的像素映射到真实世界的物理测量值(原始校准的空间点)。变换在工具训练时计算一次并存储在工具中。运行N点校准工具时,它会将此变换附加到输入图像的坐标空间树,并返回图像的副本,以供其他视觉工具使用。一旦创建了一个校准的空间,就可以使用它将其他视觉工具提供的位置和测量信息关联到精确的物理位置。

本主题向您介绍如何使用N点校准工具CogCalibnPointToPointTool来执行校准过程中涉及的两个步骤。有关校准和N点校准工具的更多信息,请参阅主题校准和固定。

开始之前

选择项目->添加引用并添加对Cognex.VisionPro.CalibFix装配到您的视觉工作室.NET项目。

你的程序需要能够获取图像并显示出来。本主题中的示例代码假定您已经初始化了用于获取图像的CogAcqFifoTool,并且您已经创建了一个带有显示控件的窗体,以显示最终校准的图像和图形。

获取校准图像

校准时,您将获得带有基准标记的特殊校准板或电路板的图像。板或板提供精确测量的距离和已知位置。要在工具之间的校准空间中获得有效结果,必须在运行时从校准时使用的同一照相机和镜头获取图像。

定位未校准的特征点

使用视觉工具,如cogpmalightool或CogBlobTool,在获取的图像中定位特征。图像的选定空间是未标定的空间。您将使用找到的特征的坐标作为未校准空间中N个点的集合,作为校准工具的输入。

有关使用PatMax Align工具或Blob工具定位点的更多信息,请分别参阅查找模式或计数对象主题

创建一个N点标定工具

创建一个N点校准工具,并将工具的输入图像设置为AcqFifo获取的图像。

复制
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.ImageFile;

private CogCalibNPointToNPointTool myCalibTool;

private void SetUpCalibTool()
{
myCalibTool = new CogCalibNPointToNPointTool();

myCalibTool.InputImage = myImageFileTool.OutputImage;
}

选择要匹配的点数

确定每组中未校准和原始校准的点数(N),以作为N点校准工具的输入。对于N点校准,您至少提供三个点,但是为了获得更准确的结果,您可以使用更多的点。请注意,因为您正在计算校准变换(其中包括缩放、纵横比、倾斜、旋转等),所以每个点集中至少需要三个默认点。此外,这些点不能共线。它们应该分散在你的输入图像中

添加未校准和原始校准点对

您可以从特征定位工具的输出中获得未标定空间中的点的坐标。还必须在原始校准空间中指定一组N个点。通常,您可以通过测量对象的物理模型、绘制其原理图或使用具有规则图案(例如网格)且具有已知尺寸的对象来获得原始校准点的坐标。可以使用AddPointPair方法添加一对点。

要在以后更改点值,可以使用以下方法分别设置x和y坐标:

  • SetUncalibratedPointX和SetUncalibratedPointY
  • SetRawCalibratedPointX和SetRawCalibratedPointY

也可以使用宽设置器SetUncalibratedPoint和SetRawCalibratedPoint来更改点值。

以下代码显示了如果知道对象特征之间的距离,如何在未标定和原始标定空间中添加点对。例如,对象上可能有三个重要特性。两个点位于距离主地物155mm和52mm处。将原始校准空间的原点放置在(0,0)处,并提供其他距离值作为点(155,0)和(0,52),如下图所示。

VisionPro N点标定N-Point Calibration

VisionPro N点标定N-Point Calibration

注意,在添加新点之前,代码会删除所有默认点,将NumPoints设置为零。在本例中,您还可以使用wide setters来更改默认点的值。

复制
private void SetUpPointPairs()
{
myCalibTool.Calibration.NumPoints = 0;

myCalibTool.Calibration.AddPointPair(myPMTool.Results[0].GetPose().TranslationX,
myPMTool.Results[0].GetPose().TranslationY, 0, 0);
myCalibTool.Calibration.AddPointPair(myPMTool.Results[1].GetPose().TranslationX,
myPMTool.Results[1].GetPose().TranslationY, 155, 0);
myCalibTool.Calibration.AddPointPair(myPMTool.Results[2].GetPose().TranslationX,
myPMTool.Results[2].GetPose().TranslationY, 0, 52);
}

指定自由度

自由度决定了N点校准工具在计算定义校准空间的变换时将使用的变换组件。默认情况下,校准工具启用所有自由度:缩放、纵横比、旋转、倾斜和平移。要在点集之间找到最佳拟合,通常需要保持所有自由度。CogNPointToNPointDOFConstants枚举指定在N点拟合操作期间可以计算的各种自由度。

复制
private void SetDOFs()
{
myCalibTool.Calibration.DOFsToCompute =
CogNPointToNPointDOFConstants.ScalingAspectRotationSkewAndTranslation;
}

配置调整转换

您可能希望将最终校准的空间放置在不同于物理位置值指示的位置。您可能会发现,在应用程序中,将已校准空间的原点放置在对象的中心,而不是在其角上。校准工具计算最佳拟合变换,以将原始校准点映射到未校准点,然后应用指定的调整变换以创建最终校准空间。CogCalibnPointToPointTool提供以下方法来执行此调整:

  • 校准原点和校准原点
  • 校准X轴旋转
  • Swapc校准用手习惯

您不能调整最终校准空间的缩放或倾斜值,因为这几乎肯定会生成表示无效校准空间的二维变换。

您还必须通过向CalibratedOriginationSpace和CalibredXaxisRotationSpace属性提供CogCalibbPointAdjustmentSpaceConstants枚举值,向工具指示是否已在未校准或原始校准空间中表示原点和旋转调整。例如,如果希望将已校准空间的原点放置在图像的确切中心,则可以方便地指定未校准空间中的调整。

以下代码将最终校准空间的原点相对于原始校准空间轴移动50个单位,使其在对象特征之间居中。它不会旋转x轴或交换最终校准空间的利手度。请注意,如果以未校准的空间表示原点调整,则最终坐标轴将向图像中心移动50个单位。

复制
private void SetAdjustTansform()
{
myCalibTool.Calibration.CalibratedOriginSpace = CogCalibNPointAdjustmentSpaceConstants.RawCalibrated;
myCalibTool.Calibration.CalibratedXAxisRotationSpace = CogCalibNPointAdjustmentSpaceConstants.RawCalibrated;
myCalibTool.Calibration.CalibratedXAxisRotation = 0;
myCalibTool.Calibration.CalibratedOriginX = 50;
myCalibTool.Calibration.CalibratedOriginY = 0;
myCalibTool.Calibration.SwapCalibratedHandedness = false;
}

选择要输出的已校准空间名称和空间

校准图像时,校准工具会将表示校准空间的计算变换附加到输入图像的坐标空间树。将此新空间的名称提供给CalibratedSpaceName属性。名称必须是有效的非限定空间名称。您还必须设置输出图像的选定空间。为SpaceToOutput特性提供一个cogCalibsPaceOutputConstants值,以指示输出映像的选定空间名称是未校准空间名称的完全限定副本还是已校准空间名称的完全限定副本。输出空间确定输出图像的选定空间名称。任何接收此图像作为输入的其他工具都将在此选定的空间中报告其结果。

复制
private void SetSpaces()
{
myCalibTool.RunParams.CalibratedSpaceName = "N-Point Calibration Result";
myCalibTool.RunParams.SpaceToOutput = CogCalibSpaceToOutputConstants.CalibratedSpace;
}

在记录中包括输入、诊断和校准数据

您可以在工具的CurrentRecord和LastRunRecord中包含各种输入、诊断和校准数据。例如,可以使用此数据显示交互式和非交互式图形,这些图形表示未标定、原始标定和已标定空间中的坐标轴和点。要包含此类数据,请启用适当的工具记录,并使用CurrentRecordEnable、LastRunRecordDiageEnable和LastRunRecordEnable属性选择要包含的数据。cogCalibnPointToPointCurrentRecordConstants、CogCalibnPointToPointLastRunRecordDiagConstants和CogCalibnPointOnPointLastRunRecordConstants枚举的值指定可以包含在工具记录中的数据类型。

复制
private void SetRecordOptions()
{
myCalibTool.CurrentRecordEnable = CogCalibNPointToNPointCurrentRecordConstants.UncalibratedAxes |
CogCalibNPointToNPointCurrentRecordConstants.CalibratedAxes |
CogCalibNPointToNPointCurrentRecordConstants.CalUncalibratedPoints |
CogCalibNPointToNPointCurrentRecordConstants.CalRawCalibratedAxes |
CogCalibNPointToNPointCurrentRecordConstants.CalRawCalibratedPoints |
CogCalibNPointToNPointCurrentRecordConstants.CalCalibratedAxes |
CogCalibNPointToNPointCurrentRecordConstants.CalUncalibratedPoints;

myCalibTool.LastRunRecordDiagEnable = CogCalibNPointToNPointLastRunRecordDiagConstants.UncalibratedAxes |
CogCalibNPointToNPointLastRunRecordDiagConstants.CalibratedAxes;
}

完成标定

在训练时校准工具一次,然后在运行工具时使用预计算的校准。要计算定义校准空间的2D变换,可以调用工具的train time parameters对象的Calibrate方法。该工具存储计算的校准值。

复制
private void ComputeCalibration()
{
myCalibTool.Calibration.Calibrate();
}

检查RMS错误

校准后,应检查计算的均方根(RMS)误差值。在计算最佳拟合变换后,均方根误差测量两组N点之间的变化。较大的RMS误差值可能表示点不在适当的位置,因此工具测量不正确;或者您没有为计算启用足够的自由度(DOF)。可以从刀具参数的ComputedRMSError属性获取校准的RMS误差。

运行N点标定工具

运行N点校准工具将校准空间的预计算变换附加到输入图像的坐标空间树,并返回CogImage的副本以供其他视觉工具使用。通过调用N点校准工具的run方法来运行它。

在下面的示例中,Blob工具接收来自校准工具的图像输出。Blob工具在校准的空间中运行。

复制
private void RunTool()
{
CogBlobTool myBlobTool = new CogBlobTool();

myCalibTool.Run();

myBlobTool.InputImage = myCalibTool.OutputImage;
myBlobTool.Run();
}

您还可以显式使用UncalibratedFromCalibrated转换来设置其他工具和图形的值。通过调用GetComputedUncalibratedFromCalibratedTransform方法可以获得此转换。下面的代码演示如何使用返回的转换来配置一个坐标轴图形,该图形显示显示器上的最终校准空间。有关显示图形的详细信息,请参见绘制图形。

复制
private void DrawAxes()
{
    if (myCalibTool.Calibration.Calibrated)
    {
        CogCoordinateAxes myAxes = new CogCoordinateAxes();

        myAxes.Transform = myCalibTool.Calibration.GetComputedUncalibratedFromCalibratedTransform();

        myAxes.Color = CogColorConstants.Green;
        myAxes.XAxisLabel.Color = CogColorConstants.Green;
        myAxes.YAxisLabel.Color = CogColorConstants.Green;
        myAxes.DisplayedXAxisLength = 50;

        cogDisplay1.InteractiveGraphics.Add(myAxes, "", false);
    }
}

感觉很棒!可以赞赏支持我哟~

24 打赏

评论 (15)

登录后评论
VS里面我怎么引用不到using Cognex.VisionPro.CalibFix;
你这个是vp里面的脚本吗??????
你需要添加引用文件,再使用using命令引用,才能使用。
请问这个能用做机器人和相机之间的坐标转换吗
这个工具就是用来统一坐标系的,当然可以。
狗哥请问我用棋盘格标定然后怎么把像素点转实际点的值
将标定后的标定工具放在测量前面,选择标定后的图像空间,测量结果就是标定后的值了。
RMS多大才算误差小,还有一个问题就是我们在手眼标定(九点标定)的RMS含义是一样的吗,数值多小才算合适?才算标定成功?
RMS只是参考,标定成功与否的标准应该用标定后测量的数据进行对比。
请问校正后 R旋转怎么校正
标定跟旋转没关系哟
就是镜头视野外的区域 不是蓝色吗, 有办法变成黑色吗
修改控件属性BackColor即可。
我用的是CogRecordDisplay控件显示图片,除了相机视野内的区域是黑白的,其他区域都是蓝色的,我查看了cogRecordDisplay控件的属性backcolor属性也改成黑色,所有带亚瑟属性都改成黑色,然后运行,cogRecordDisplay显示图片后,鼠标缩小图片,发现视野外的区域还是蓝色。请问怎么样变成黑色呢?
visionpro 能把运行后的显示窗口的背景颜色由 蓝色 改成黑色吗?
运行一次后再次给backcolor属性赋值即可
QQ咨询 邮件咨询 狗哥推荐