# 使用 PMAlign 工具为 ViDi 红色分析工具固定图像

本主题描述如何将 PMAlign 工具生成的变换转换为 Cognex ViDi Suite 工具理解的变换。它还描述了如何使用变换来修改 ViDi 工具的关注区域，以便创建一个固定视图，以适应输入图像之间的转化和旋转差异。

## 转换变换

VisionPro 工具的 ROI 可以用绝对坐标定义，也可以用相对于 PMAlign 工具找到的模式的坐标定义。这是通过定义 CogTransform2DLinear 来完成的，CogTransform2DLinear 将相对于图案的点映射到输入图像中的像素点。默认情况下，PMAlign 工具将图案空间中的地图点设置为输入图像选中空间中的点；如果所选空间不是像素空间（例如，图像被二次采样或校准），则需要从选定空间到像素空间的附加变换。

提示:

###### API 示例

    // 从图现象空间转换为像素空间，因为 ViDi 需要按像素定义线性变换

    ICogTransform2D fromSelectedToPixelTransform = cogImage.GetTransform("#", ".");

    CogTransform2DLinear fromPatternToPixelLinearTransform = fromSelectedToPixelTransform.ComposeBase(<Pose>).LinearTransform(0, 0);

在这种情况下， <Pose> 是 PMAlign 工具返回的转换。

类似地，ViDi 工具的 ROI（或视图）可以用绝对坐标定义，也可以用相对于前一个工具的输出的坐标定义，例如蓝色工具的模型。这是通过定义 System.Windows.Media.Matrix 来完成的，System.Windows.Media.Matrix 将相对于前一输出的点映射到输入图像中的点像素。

当然，通过将 PMAlign 工具的输出从 CogTransform2DLinear 转换为像素矩阵并将视图映射到该矩阵，可以创建相对于匹配的 PatMax 图案的视图。

注意:

- 扩展方法 ToMatrixTransform 可用于将 CogTransform2DLinear 转换为等效的 System.Windows.Media.Matrix。
- 扩展方法 ToLinear2DTransform 可用于执行反向转换。

## 创建固定视图

在训练 ViDi 工具之前，必须定义工具将在其上运行的视图。从 Cognex ViDi Suite GUI，编辑矩形 ROI，将 ROI 应用于训练图像，然后处理所有训练图像（将变换应用于每个图像）即可完成。在 API 中，工具的 RegionOfInterest 必须设置为 IManualRegionOfInterest，并且必须手动指定视图使用的尺寸和转换。然后，工具必须处理图像。

注意:

- IManualRegionOfInterest 接口会开放 AddView 方法，该方法接受视图的尺寸以及矩阵变换。
  - 请记住将 PMAlign 工具姿势转换为像素空间。
  - 传递 (0.0,0.0) 的尺寸将导致新视图默认设置为 IManualRegionOfInterest 的尺寸。
  - 如果您没有使用 GUI 并且想要将 ROI 从其默认位置（位于匹配图案中心点的原点）移开，请记住将最终的姿势矩阵与描述 ROI 应如何从其默认位置移动的矩阵组合（见下面的插图示例）。当您拖动或旋转 ROI 时，GUI 会为您处理此问题。
- AddView 也将出现重载，接受 CogTransform2DLinear 而不是 Matrix。

## 摘要

通过执行以下操作，可以用 PMAlign 工具固定 ViDi 工具：

1. 从 CogPMAlignResult 获得姿势。
   1. 使用所提供的扩展方法将姿势从 CogTransform2DLinear 转换为 System.Windows.Media.Matrix。
2. 从 ViDi 工具获取 RegionOfInterest 并将其转换为 IManualRegionOfInterest。
3. 在 IManualRegionOfInterest 上调用 AddView 方法来创建固定的视图，传入一个尺寸和姿势矩阵。
4. 处理图像。

对于训练，在训练工具之前，应对每个训练图像重复此过程。这确保了工具将在每个训练图像的固定视图上进行训练，而对整个训练图像进行训练。当然，这涉及首先通过 PMAlign 工具运行每个训练图像以生成视图的变换，因为每个图像的固定件可能移动。

对于运行时，必须对每个传入图像执行此程序，以便工具处理图像的固定视图，而不是图像本身。同样，这需要首先通过 PMAlign 工具运行图像。

注意:

- 通过调用 ITool.IToolDatabase.Process 方法处理训练图像，传入与训练图像对应的文件名筛选工具以进行处理。
  - 传递给 AddView 的名称应该是图像的名称。
- 在运行时处理输入图像是通过从图像创建一个 ISample 并调用 ISample.Process、传入应该处理图像的 ITool 来完成的。
  - 传递给 AddView 的名称应该是样本的名称（即ISample.Name）。