应用场景:
比如在一个视觉项目应用中,由于FOV过大,单相机像素精度不能满足预期,那么就需要分开布局多个相机拍摄。但是如果涉及到测量,定位,计数等类似应用的时候,图像拼接技术则显的非常重要。
这里模拟四台相机分别拍摄一组二维码图像,然后将四张图拼接成为一张图,最后实现读码的功能。
实现功能:
1. 准备4张图像
2. 在VisionPro中新建一个ToolBlock,然后添加4个CogImageFileTool工具
3. 然后依次加载上面准备好的4张图像
注意:这里用CogImageFileTool工具模拟真实环境中4台相机,真实环境中
只需要将CogImageFileTool替换成CogAcqFifoTool,然后为每个CogAcqFifoTool工具分配一台相机即可。
4. 添加CogIDTool工具,用于读取拼接后图像的二维码
这里的InputImage可以暂时不用引用,后面直接在脚本中赋值即可。
5. 重点部分:为ToolBlock编写脚本
5.1 添加程序集Dll
5.2 引用命名空间:
5.3 代码部分:
1 public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
2 {
3 private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
4 private List<CogImage8Grey> imgList = new List<CogImage8Grey>();
5 private CogCopyRegionTool imageStitcher = new CogCopyRegionTool();
6 private CogIDTool idTool;
7
8 public override bool GroupRun(ref string message, ref CogToolResultConstants result)
9 {
10 //if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();
11 imgList.Clear();
12
13 // Run each tool using the RunTool function
14 foreach(ICogTool tool in mToolBlock.Tools)
15 {
16 if(tool is CogImageFileTool)
17 {
18 //如果是真实现场的相机,这里需要改成CogAcqFifoTooL
19 CogImageFileTool imageTool = (CogImageFileTool) tool;
20 imageTool.Run();
21 if(imageTool.OutputImage != null)
22 {
23 //将所有采到的图像,按上往下的顺序,依次保存在List集合中
24 imgList.Add((CogImage8Grey)imageTool.OutputImage);
25 }
26 }
27 }
28
29 CogImage8Grey img = new CogImage8Grey();
30 img.Allocate(imgList[0].Width * 2, imgList[0].Height * 2);
31
32 //指定画框
33 imageStitcher.DestinationImage = img;
34
35 imageStitcher.Region = null;
36 imageStitcher.RunParams.ImageAlignmentEnabled = true;
37
38 for (int i = 0; i < 4; i++)
39 {
40 //这里指定图像存放在画框中的起始XY点,然后程序跳转到if else下面
41 //将当前遍历到的照片贴进画框中
42 if(i == 0)
43 {
44 imageStitcher.RunParams.DestinationImageAlignmentX = 0;
45 imageStitcher.RunParams.DestinationImageAlignmentY = 0;
46 }
47 else if(i == 1)
48 {
49 imageStitcher.RunParams.DestinationImageAlignmentX = imgList[i].Width;
50 imageStitcher.RunParams.DestinationImageAlignmentY = 0;
51 }
52 else if(i == 2)
53 {
54 imageStitcher.RunParams.DestinationImageAlignmentX = 0;
55 imageStitcher.RunParams.DestinationImageAlignmentY = imgList[i].Height;
56 }
57 else
58 {
59 imageStitcher.RunParams.DestinationImageAlignmentX = imgList[i].Width;
60 imageStitcher.RunParams.DestinationImageAlignmentY = imgList[i].Height;
61 }
62 //将当前遍历到的图像贴进画框中
63 imageStitcher.InputImage = CogImageConvert.GetIntensityImage(imgList[i], 0, 0, imgList[i].Width, imgList[i].Height);
64 imageStitcher.Run();
65 }
66 mToolBlock.Outputs[0].Value = imageStitcher.OutputImage;
67
68 // Read ID Tool
69 idTool= mToolBlock.Tools["CogIDTool1"] as CogIDTool;
70 idTool.InputImage = (CogImage8Grey) mToolBlock.Outputs[0].Value;
71 idTool.Run();
72
73 return false;
74 }
75 }
原理: 可以将CogCopyRegionTool对象想象成一个尚未完成的画框,因为要装4张图,所以首先需要确定画框尺寸 (一张图*2的大小)。
然后准备装照片进去了,拿到一张照片后,首先确定照片应该放置的位置 (第一张00,第二张10,第三张01,第四张11这样)。
确认完一张图像位置之后,则将当前的图片装入指定的位置,以此往复。
6. 最终,我们会得到一张全新的无缝拼接图片(为了便于展示直接通过代码的形式将其传入CogODTool工具的输入)