Upload
others
View
12
Download
0
Embed Size (px)
Citation preview
Adaptive Vision Library
Adaptive Vision Library .NET
方案
此PPT中我们将解释:
• AVL.NET 与 C# 的入门
• 架构
• AVL 库的用法
• 基本故障排除
AVL 入门
5
简介
Adaptive Vision Library .NET (AVL.NET) 是一个为.NET框架程序员而设计的视觉库,为他们提供用于创建工业图像分析应用程序的一套函数。
▪ 图像处理
▪ 斑点分析
▪ 几何运算
▪ 形状拟合
▪ 相机标定
▪ 条码识别
▪ 二维条码识别
▪ 1D 剖面分析
▪ 测量
▪ 模板匹配
▪ 光学字符识别 (OCR)
▪ 支持 GigE Vision 与GenICam
▪ 3D 机器视觉
▪ 深度学习
6
AVL 入门
在 Microsoft Visual Studio 打开 Avl.NET wizard 并创建新 Visual C# 项目。
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位版本
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();}
}
9
架构
10
AVL.NET程序集
Avl.Net.TS.dll
Avl.Net.dllAvl.dll
Avl.Net.Designers.dllGenicam.Net.dllGenicam_kit.dll
对C ++库的引用
对.NET库的引用
11
AVL 与 AVL.NET 的关系
• AVL.NET是一种包装库 – 需要AVL.DLL才能运行。
• AVL.NET由从AVL.DLL调用本机函数的函数而组成
• 此函数库适用于任何在.NET平台支持的程式语言 (C#, VB, .NET 等)
• AVL.NET 具有与 .NET 一起使用的扩展 (例如: Image.CreateBitmap())
• 所有C ++异常都转换为.NET异常类。
12
AVL 与 AVL.NET 之间的区别
AVL AVL.NET
可为空的类型atl:Conditional atl::Optional
AvlNet.INullable System.Nullable
空值/自动值 atl::Nil null / 默认构造器
对象寿命 基于范围• 由垃圾收集器管理• 使用 using 语句• 手动释放
函数覆盖 单个函数变体 多个被覆盖的函数变体
13
AVL.NET 类型
AVL.NET 包括两个类型:
可释放的 - 具有指向AVL基础类型指针的类型。• 例如: Image、Region、EdgeModel 等.
• 实现IDisposable接口。
不可释放类型和结构 - .NET中有C ++等效实现的基本类型。• 例如: Point2D、Box2D 和枚举.
• 未实现IDisposable的类。
14
AVL.NET 类型 – 不可释放类型
Point2D point = new Point2D();Vector2D vector = new Vector2D(10, 20);Point2D newPoint;
AVL.TranslatePoint(point, vector, false, out newPoint);
• 不可释放的类和结构不包含 AVL 对象的任何基础参考,因此没有内存泄漏的风险。
• 类型用 out 运算符返回。
• 每次创建新实例。内存无法重用。
• 在结构中,所有的结构场都在无参数构造函数中清零。
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);
}}
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
)
17
AVL.NET 可为空的类型
• 结构使用 AvlNet.NullableValue <T> 类以进行可选输出参数传递:
public static void FitLineToPoints(
IList<Point2D> inPoints,out Line2D? outLine,NullableValue<float> outError
)
18
AVL.NET 可为空的类型
• 所有的类都使用 AvlNet.INullable <T> 接口以传递可选参数。
public static void FitPathToEdges(
Image inImage,PathFittingMap inFittingMap,EdgeScanParams inEdgeScanParams,Selection inEdgeSelection,float inMaxIncompleteness,INullable<Path> outPath
)
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 模式。
20
AVL.NET 可为空的类型
用于值类型的Inullable实现
• NullableValue<T> - 类似于参考的 System.Nullable<T> 结构的替代,在未out参数修饰符情况下用于获取输出参数。
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}
22
AVL 库的用法
23
AVL.NET 的用法
• Avl.NET 提供核心类型和函数库。
• GenICam.NET 提供 GenICam 和 GigEVision标准的支持。
• 以下的库提供其他工具:
• Avl.NET Designers – 用于创建复杂类型(如“区域”或“模板匹配”类型)的高级GUI工具库。
• HMI 控件 – 一组特定于工业的UI控件,例如旋钮,模拟指示器和其他控件。
• VideoBox控件 - 高度优化的控件,用于以各种选项显示图像和形状: VideoBox、ZoomingVideoBox、ViewBox2D、ViewBox3D。
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");}
}
25
AVL.NET 的用法
HMI 控件 – 一组特定于工业的UI控件,例如旋钮,模拟指示器和其他控件。
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
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对象。
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以实现复杂多功能的用户界面。
29
基本故障排除
30
配置问题
• 错误:输出目录中缺少AVL.dll文件。• 解决方案:将构建后事件添加到您的解决方案中。
• 错误:混合的应用程序和运行时二进制文件平台• 解决方案:(如果可能) 仅使用64位库。• 解决方案:不要使用任何CPU构建配置
• 错误:无法加载Windows窗体设计器• 解决方案:由于Visual Studio的问题,请仅使用32位库来开发UI。
之后,可以用64位库以构建该应用程序。
31
内存泄漏 (WinForms)
不释放所分配的属性:
using (Image rgb = new Image()){
AVL.TestImage(TestImageId.Lena, rgb, null);pictureBox1.Image = rgb.CreateBitmap();
}
• 在此处,新图像(位图)已分配给pictureBox1.Image,但旧图像未正确释放。
• 这种“丢失”的位图过了一段时间将被自动释放,但是在快速应用程序中,这可能在垃圾回收器释放丢失的对象前会占用整个计算机内存。
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();}
33
内存泄漏
缺少对象丢弃模式:
• 当按下按钮时,将创建一个图像的新实例,但不会将其丢弃。
• 容易与C ++对象的生存期混淆。对于C#对象,超出了范围时对象不会自动释放。
private void button_Click(){
Image image = new Image();AVL.LoadImage("test.png", false, image);AVL.DebugPreviewShowNewImage(image);
}
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);
}}
正确:
35
内存泄漏
缺少 using 语句:
• 如果FooBar函数中引发异常,则图像将无法正确释放。
• 使用 using 语句。
• 使用 try-catch-finally 块。
Image image = new Image();AVL.LoadImage("test.png", false, image);FooBar(image);image.Dispose();
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);
}
正确:
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 类不提供有效的释放方法。
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);
}
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