在视觉应用程序中,通常需要将采集图像中对象的测量值和位置与有意义的真实值关联起来。你可以通过校准你的视觉系统来完成。校准是一个计算二维转换的过程,它将图像坐标映射到真实世界坐标,并将计算的变换附加到输入图像。此过程适用于整个相机图像或世界视图,消除相机纵横比和镜头失真。
在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),如下图所示。
注意,在添加新点之前,代码会删除所有默认点,将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); } }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241968.html