adaptive vision library...•videobox控件-...

39

Upload: others

Post on 12-Oct-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET
Page 2: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

Adaptive Vision Library

Adaptive Vision Library .NET

Page 3: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

方案

此PPT中我们将解释:

• AVL.NET 与 C# 的入门

• 架构

• AVL 库的用法

• 基本故障排除

Page 4: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

AVL 入门

Page 5: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

5

简介

Adaptive Vision Library .NET (AVL.NET) 是一个为.NET框架程序员而设计的视觉库,为他们提供用于创建工业图像分析应用程序的一套函数。

▪ 图像处理

▪ 斑点分析

▪ 几何运算

▪ 形状拟合

▪ 相机标定

▪ 条码识别

▪ 二维条码识别

▪ 1D 剖面分析

▪ 测量

▪ 模板匹配

▪ 光学字符识别 (OCR)

▪ 支持 GigE Vision 与GenICam

▪ 3D 机器视觉

▪ 深度学习

Page 6: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

6

AVL 入门

在 Microsoft Visual Studio 打开 Avl.NET wizard 并创建新 Visual C# 项目。

Page 7: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

7

AVL 入门

项目手动配置

1. 创建一个新C#项目(WinForms,WPF 或控制台)

2. 添加对库的引用• Avl.Net.dll – AVL 函数• Avl.Net.TS.dll – AVL.NET 类型• Avl.Net.Designers.dll – 高级图形设计器(可选)• Avl.Net.Amr.dll (引用 Avl.Net.Designers.dll 时)• Avl.Net.Kit.dll (引用 Avl.Net.Designers.dll 时)• Genicam.Net.dll – GenICam 函数库 (可选)

3. 复制其他本机库• Avl.dll• Genicam_Kit.Dll (引用 Genicam.Net.dll 时)

注意:所有Avl.NET库都有 32位和 64位版本

Page 8: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

8

AVL 入门

示例程序

此应用程序在窗体中显示一个基本图像。

using System;using System.Windows.Forms;using AvlNet;

private void button_Click(){

using (var imageRgb = new Image()){

AVL.TestImage(TestImageId.Baboon, imageRgb, null);

if (pictureBox1.Image != null)pictureBox1.Image.Dispose();

pictureBox1.Image = imageRgb.CreateBitmap();}

}

Page 9: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

9

架构

Page 10: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

10

AVL.NET程序集

Avl.Net.TS.dll

Avl.Net.dllAvl.dll

Avl.Net.Designers.dllGenicam.Net.dllGenicam_kit.dll

对C ++库的引用

对.NET库的引用

Page 11: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

11

AVL 与 AVL.NET 的关系

• AVL.NET是一种包装库 – 需要AVL.DLL才能运行。

• AVL.NET由从AVL.DLL调用本机函数的函数而组成

• 此函数库适用于任何在.NET平台支持的程式语言 (C#, VB, .NET 等)

• AVL.NET 具有与 .NET 一起使用的扩展 (例如: Image.CreateBitmap())

• 所有C ++异常都转换为.NET异常类。

Page 12: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

12

AVL 与 AVL.NET 之间的区别

AVL AVL.NET

可为空的类型atl:Conditional atl::Optional

AvlNet.INullable System.Nullable

空值/自动值 atl::Nil null / 默认构造器

对象寿命 基于范围• 由垃圾收集器管理• 使用 using 语句• 手动释放

函数覆盖 单个函数变体 多个被覆盖的函数变体

Page 13: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

13

AVL.NET 类型

AVL.NET 包括两个类型:

可释放的 - 具有指向AVL基础类型指针的类型。• 例如: Image、Region、EdgeModel 等.

• 实现IDisposable接口。

不可释放类型和结构 - .NET中有C ++等效实现的基本类型。• 例如: Point2D、Box2D 和枚举.

• 未实现IDisposable的类。

Page 14: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

14

AVL.NET 类型 – 不可释放类型

Point2D point = new Point2D();Vector2D vector = new Vector2D(10, 20);Point2D newPoint;

AVL.TranslatePoint(point, vector, false, out newPoint);

• 不可释放的类和结构不包含 AVL 对象的任何基础参考,因此没有内存泄漏的风险。

• 类型用 out 运算符返回。

• 每次创建新实例。内存无法重用。

• 在结构中,所有的结构场都在无参数构造函数中清零。

Page 15: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

15

AVL.NET 类型 – 可释放类型

• using 语句确保在任何情况下(返回,异常等)都将释放基础的 avl::Image 对象。

• 释放不正确的对象会导致内存泄漏。

• 如果加载的图像大小相同,则不会执行内存分配。图像占用的内存将被重用。

using (var image = new Image()){

for (int i = 0; i < 10; ++i){

AVL.LoadImage(i+".png", false, image);Console.WriteLine("{0}.png: {1}x{2}", i, image.Width, image.Height);

}}

Page 16: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

16

AVL.NET 可为空的类型

• 结构使用 System.Nullable <T> 结构进行传递:o 可选和条件性输入参数

o 条件性输入参数

public static void SegmentSegmentIntersection(

Segment2D inSegment1,Segment2D inSegment2,out Point2D? outIntersectionPoint

)

public static void ProfileSum(

Profile inProfile,Range? inRange,out float? outSum

)

Page 17: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

17

AVL.NET 可为空的类型

• 结构使用 AvlNet.NullableValue <T> 类以进行可选输出参数传递:

public static void FitLineToPoints(

IList<Point2D> inPoints,out Line2D? outLine,NullableValue<float> outError

)

Page 18: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

18

AVL.NET 可为空的类型

• 所有的类都使用 AvlNet.INullable <T> 接口以传递可选参数。

public static void FitPathToEdges(

Image inImage,PathFittingMap inFittingMap,EdgeScanParams inEdgeScanParams,Selection inEdgeSelection,float inMaxIncompleteness,INullable<Path> outPath

)

Page 19: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

19

AVL.NET 可为空的类型

用于参考类型的Inullable实现

• NullableRef<T> - 此类以 System.Nullable 相同的方式将 T this 类型进行包装• 如果 T 实现 IDisposable,用户则必须手动地将其释放:

using (var path = AvlNet.Nullable.CreateSafe<Path>()){

AVL.FitPathToEdges(image, map, params, Selection.Best, 0.9f, path);}

using (var path = new Path()){

var nullable = AvlNet.Nullable.Create(path);AVL.FitPathToEdges(image, map, parameters, Selection.Best, 0.9f, nullable);

}

• SafeNullableRef<T> - 此类以 NullableRef<T> 相同的方式将 T this 类型进行包装,此外实现 IDisposable 模式。

Page 20: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

20

AVL.NET 可为空的类型

用于值类型的Inullable实现

• NullableValue<T> - 类似于参考的 System.Nullable<T> 结构的替代,在未out参数修饰符情况下用于获取输出参数。

Page 21: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

21

AVL.NET 的集合类型

• AVL.NET函数中大多数类似集合的参数都属于 System.Collections.Generic.IList<T> 类型。通过此类型,可以传递实现该接口的所有集合,包括普通的C#数组。

• 输出应与类型实例一起传递,其大小可以更改(例如: System.Collections.Generic.List<T>)

• SafeList<T>- 此类有助于管理集合元素的寿命(实现 IDisposable 模式并完成元素的删除)

using (var blobs = AvlNet.SafeList<Region>()){

AVL.SplitRegionIntoBlobs(..., blobs);foreach (var blob in blobs)

// do something with blob}

Page 22: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

22

AVL 库的用法

Page 23: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

23

AVL.NET 的用法

• Avl.NET 提供核心类型和函数库。

• GenICam.NET 提供 GenICam 和 GigEVision标准的支持。

• 以下的库提供其他工具:

• Avl.NET Designers – 用于创建复杂类型(如“区域”或“模板匹配”类型)的高级GUI工具库。

• HMI 控件 – 一组特定于工业的UI控件,例如旋钮,模拟指示器和其他控件。

• VideoBox控件 - 高度优化的控件,用于以各种选项显示图像和形状: VideoBox、ZoomingVideoBox、ViewBox2D、ViewBox3D。

Page 24: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

24

AVL.NET 的用法

Avl.NET Designers – 用于创建复杂类型(如“区域”或“模板匹配”类型)的高级GUI工具库。

private void button_Click(){

using (var editor = new AvlNet.Designers .RegionDesigner())

{var result = editor.ShowDialog();if (result != DialogResult.OK)

return;

AVL.SaveRegion(editor.Region, "out.avdata");}

}

Page 25: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

25

AVL.NET 的用法

HMI 控件 – 一组特定于工业的UI控件,例如旋钮,模拟指示器和其他控件。

Page 26: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

26

Video Box 控件

Video Box 控件 – 高度优化的控件,用于以各种选项显示图像和形状。如果可用,将使用DirectX加速。

using(Image color = new Image())using(Region region = new Region()){

AVL.TestImage(TestImageId.Baboon, color, null);AVL.CreateBoxRegion(new Box(50, 50, 100, 100),

512, 512, region);

viewBox.Image.SetImage(color);

viewBox.Data1.SetRegion(region);viewBox.Data1.Color = System.Drawing.Color.Yellow;

viewBox.Data2.SetSegment(new Segment2D(100, 100, 500, 450));

viewBox.Data2.LineWidth = 10;}ViewBox2D

Page 27: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

27

Video Box 控件

using (Surface surface = new Surface()){

AVL.LoadSurface("surface.avdata", surface);box3D.Data1.SetSurface(surface);

box3D.ScaleColoringMode = View3DColoringMode.ZAxis;}

ViewBox3D

ViewBox3D控件可用于使用DirectX加速显示3D对象。

Page 28: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

28

AVL.NET 和 Adaptive Vision Studio

通过集成 Avl.NET 和 Adaptive Vision Studio .NET 宏过滤器生成器,Avl.NET 可用于创建复杂的解决方案。

1. 使用Adaptive Vision Studio开发并测试视觉算法

2. 在您的宏过滤器包装库中使用Adaptive Vision Runtime

3. 使用AVL.NET以实现复杂多功能的用户界面。

Page 29: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

29

基本故障排除

Page 30: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

30

配置问题

• 错误:输出目录中缺少AVL.dll文件。• 解决方案:将构建后事件添加到您的解决方案中。

• 错误:混合的应用程序和运行时二进制文件平台• 解决方案:(如果可能) 仅使用64位库。• 解决方案:不要使用任何CPU构建配置

• 错误:无法加载Windows窗体设计器• 解决方案:由于Visual Studio的问题,请仅使用32位库来开发UI。

之后,可以用64位库以构建该应用程序。

Page 31: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

31

内存泄漏 (WinForms)

不释放所分配的属性:

using (Image rgb = new Image()){

AVL.TestImage(TestImageId.Lena, rgb, null);pictureBox1.Image = rgb.CreateBitmap();

}

• 在此处,新图像(位图)已分配给pictureBox1.Image,但旧图像未正确释放。

• 这种“丢失”的位图过了一段时间将被自动释放,但是在快速应用程序中,这可能在垃圾回收器释放丢失的对象前会占用整个计算机内存。

Page 32: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

32

内存泄漏 (WinForms)

不正确:

using (Image rgb = new Image()){

AVL.TestImage(TestImageId.Lena, rgb, null);pictureBox1.Image = rgb.CreateBitmap();

}

正确:

using (Image rgb = new Image()){

AVL.TestImage(TestImageId.Lena, rgb, null);if (pictureBox1.Image != null)

pictureBox1.Image.Dispose();

pictureBox1.Image = rgb.CreateBitmap();}

Page 33: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

33

内存泄漏

缺少对象丢弃模式:

• 当按下按钮时,将创建一个图像的新实例,但不会将其丢弃。

• 容易与C ++对象的生存期混淆。对于C#对象,超出了范围时对象不会自动释放。

private void button_Click(){

Image image = new Image();AVL.LoadImage("test.png", false, image);AVL.DebugPreviewShowNewImage(image);

}

Page 34: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

34

内存泄漏

不正确:

private void button_Click(){

Image image = new Image();AVL.LoadImage("test.png", false, image);AVL.DebugPreviewShowNewImage(image);

}

private void button_Click(){

using (var image = new Image()){

AVL.LoadImage("test.png", false, image);AVL.DebugPreviewShowNewImage(image);

}}

正确:

Page 35: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

35

内存泄漏

缺少 using 语句:

• 如果FooBar函数中引发异常,则图像将无法正确释放。

• 使用 using 语句。

• 使用 try-catch-finally 块。

Image image = new Image();AVL.LoadImage("test.png", false, image);FooBar(image);image.Dispose();

Page 36: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

36

内存泄漏

不正确:

Image image = new Image();AVL.LoadImage("test.png", false, image);FooBar(image);image.Dispose();

using (var image = new Image()){

AVL.LoadImage("test.png", false, image);FooBar(image);

}

正确:

Page 37: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

37

内存泄漏

忘记集合类型的元素:

using (Image image = new Image()){

AVL.LoadImage("i.png", false, image);

var images = new List<Image>();AVL.CutImageIntoTiles(image, 50, 50, 10, 10, false, images);

}

• 图像列表可以创建,但无法释放。

• 数组的每个元素必须被释放。

• List 类不提供有效的释放方法。

Page 38: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

38

内存泄漏

不正确:

using (var image = new Image()){

AVL.LoadImage(“test.png", false, image);

var images = new List<Image>();AVL.CutImageIntoTiles(image, 50, 50, 10, 10, false, images);

}

正确:

using (var image = new SafeList<Image>()){

AVL.LoadImage(“test.png", false, image);AVL.CutImageIntoTiles(image, 50, 50, 10, 10, false, images);

}

Page 39: Adaptive Vision Library...•VideoBox控件- 高度优化的控件,用于以各种选项显示图像和形状: VideoBox 、 ZoomingVideoBox、ViewBox2D、ViewBox3D。24 AVL.NET

Adaptive Vision Sp. z o.o .

Bojkowska 35A, 44-100 Gliwice, POLAND

电话: +48 32 461 2330

www.adaptive-vision.com

感谢您的观看!

Centrum Edukacji i Biznesu „Nowe Gliwice” ul. Bojkowska 35A, Gliwice