Halcon内存管理

1. HObject HRegion HImage对象
(1)可以直接new一个对象,但该对象是没有初始化的(即IsInitialized为false);

摘录说明(1):
a.

In addition, all classes have empty constructors to create an uninitialized object....

...If the instance was already initialized, the corresponding data structures are automatically destroyed before constructing and initializing them anew;
所有利用空构造函数构建的类对象都是未初始化的;如果已经初始化的对象,则对应的构造函数会把它给先释放,然后再重新构造新的。


b. 过程接口的HOperatorSet.GenEmptyObj比单纯new一个对象添加更多的附加判定,包括预先调用的错误码判定,然后调用new,在调用后会从一个指定的指针处进入Halcon自己的内存管理控制。

(2)对象用完之后需要Dispose
摘录说明(1):
Please note that HALCON operators always create a new object instance for output parameters and return values;
halcon每次使用算子时,对输出变量或者返回值都会创造一个新的变量,所以使用变量的时候,需要将变量原来的数据给dispose掉;除了一些类似构造对象的算子,就可以不用预先Dispose;

HImage img = new HImage();

img.ReadImage("xxx");


摘录说明(2):
Please note that HALCON operators always create a new object instance for output parameters and return values (but not in the “constructor-like” operator calls that modify the calling instance). If the variable was already initialized, its old content (and the memory allocated for it) still exists until the garbage collector removes it. If you want to remove it manually, you must call Dispose before assigning an object to it.

(3)CopyObj和Clone的区别
CopyObj只是引用增加,而Clone是深拷贝;Dispose会释放引用,假如一个对象没有引用了,则会释放内存,故在进行内存管理时,多数情况下会采用CopyObj;


2. HTuple变量
初次使用需要new;用完后要Dispose;
注意:每次赋值前需要Dispose;以out参数的方式从方法中获取返回值,在使用前也需要Dispose;

Halcon 内存溢出报警通常是由于程序运行过程中分配了过多的内存资源而未能及时释放导致的问题。以下是关于 Halcon内存管理及如何应对内存溢出的一些关键点: ### 1. **理解Halocn内存机制** - **图像处理任务**:Halcon 是一个强大的机器视觉库,广泛用于图像处理、模式识别等领域。图像数据通常占用大量内存,尤其是在处理高分辨率或多通道图像时。 - **动态内存分配**:Halcon 的操作符会自动创建临时变量存储中间结果,如果这些临时变量未被正确清理,可能会导致内存泄漏。 ### 2. **常见原因** - **循环内频繁创建大尺寸图像或对象**:例如,在循环中不断生成新图像是常见的内存消耗源。 - **长时间运行的任务**:对于需要持续运行的应用(如在线检测系统),若不注意内存回收策略,则容易触发内存不足警报。 - **外部工具包集成不当**:某些第三方组件可能存在内存泄露的风险,特别是在跨平台移植的情况下更需谨慎对待依赖项的选择。 ### 3. **解决方法** - **优化算法流程设计**: * 尽量减少不必要的计算步骤; * 对于可以复用的数据结构尽量避免重复构造销毁动作。 - **合理规划缓存大小**: * 根据实际需求设定合适的缓冲区容量限制; * 利用 `clear_image` 等命令适时清空不再使用的变量内容。 - **定期检查并强制垃圾收集**: * 使用 `dev_close_window_all()` 关闭所有窗口以释放图形界面关联的空间; * 调用类似 Python 的 `gc.collect()` 函数尝试显式地启动GC进程加快回收速度。(注:这取决于具体的编程环境) - **调试技巧**: * 可借助 HALCON 自带的日志记录功能追踪哪些部分占用了较多空间; * 或者通过其他专业性能分析工具辅助定位瓶颈所在位置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值