2.4 内存管理

所有的HALCON类,不仅仅HImage,HRegion,HTuple,HFramegrabber等等,还有面向过程的方法中使用的Hobject,都可以使用默认的析构器自动释放内存。
( see also section 2.4 “Destructors and Halcon Operators”))进一步地,当再一次构造对象,比如通过已经初始化的实例(see section “Constructors and Halcon Operators)调用CreateBarCodeModel,则已经分配好的内存将自动释放掉,然后再次重新分配。这样,在HALCON/C++中就没有必要调用clear_obj。另外,如果你的确调用了它,HALCON会抱怨已经释放了内存。

然而,仍然有两种场合需要显式地管理内存:第一种,见2.1节,string类型的输出参数,你必须为他们显式地分配内存。

第二种是当在面向过程的方法中调用句柄时:当创建一个句柄,如使用open_framegrabber内存分配,必须要在程序的末尾通过对应的算子释放内存,如close_framegrabber.

2.5 如何结合面向对象和面向过程的代码

正如前面说明的那样,我们推荐尽可能地使用面向对象的编程方法。然而,由于某些原因我们使用了面向过程的方法。比如,如果你想快速整合从HDevelop导出的代码,此种情况下,你只能通过面向过程的方法。除此之外,当前情况下,某些算子仅仅提供面向过程的方法,如创建仿射变换算子像vector_to_ragid。

图像化的参数和句柄可以通过如下方式转换:

  • 将Hobject转换为图形化的参数类
 Hobject        p_image;
 read_image(&p_image, "barcode/ean13/ean1301");

 HImage         o_image(p_image);

图形化的参数可以从Hobject转换成比如HImage,只需简单调用使用这个过程化的变量作为参数的构造函数即可。

  • 转换句柄到句柄类
HTuple         p_barcode;
  create_bar_code_model(HTuple(), HTuple(), &p_barcode);

  HBarCode       o_barcode;
  o_barcode.SetHandle(p_barcode[0]);
  o_code_region = o_barcode.FindBarCode(o_image, "EAN-13", &result);

句柄不能直接通过构造函数转换,但是,可以使用SetHandle()转换。

  • 转换句柄类为句柄
p_barcode = o_barcode.GetHandle();

相似地,一个句柄可以由对应的类通过GetHandle()获得。你可以忽略这种方法,因此句柄类提供了强制转换算子,可以自动将其转换为句柄:

p_barcode=o_barcode;
  • 转换图形化参数类为Hobject
Hobject  p_code_region = o_code_region.Id();

图形化参数可以从像HRegion这样的类转换成Hobject,只需调用方法Id()。

  • 转换HWindow为一个窗口句柄
long           p_window;
  open_window(0, 0, width/2, height/2, 0, "visible", "", &p_window);

  HWindow        o_window(0, 0, 100, 100, 0, "visible", "");

  p_window = o_window.WindowHandle();
  disp_obj(p_code_region, p_window);  

与其他句柄不同,面向过程的窗口句柄不能转换为HWindow类的对象!然而,你可以从HWindow通过WindowHandle()提取句柄。

正如章节“析构器和Halcon算子”中所说,你不能将clear_shape_model,clear_all_shape_models,or close_framegrabber和对应的句柄类一起使用。

2.6 I/O Streams

自从HALCON 7.1开始,halcon/c++不再提供输入输出流算子,因为一些项目想要使用旧的输入输出流(即他们想要使用<iostream.h>而不是<iostream>)。

为了向后兼容,对于HTuple的IO算子被提供为内联函数,存在于头文件HIOStream.h.HIOStream.h默认使用新的接口<iostream>,但是如果USE_IOSTREAM_H在HIOStream.h之前被包含,则使用旧的版本<iostream.h>.注意,包含using namespace std;可能是必须的。

为了使用IO流,我们推荐在HalconCpp.h后插入如下几行:

#include "HalconCpp.h"
using namespace Halcon;
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,370评论 11 349
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,014评论 0 7
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,420评论 25 708
  • 又到周末了,今天做了一天的实验。贝诺酯的合成,实验很失败。哎!重在参与吧。 明天周六任务:药剂学第三章表面活性剂;...
    c28369096728阅读 272评论 0 0
  • 老师评语:虽然和我的颜色不一样但是不要紧。第一:阴天的效果有,天亮底暗;第二:天偏蓝灰色,地面偏紫颜色,绿颜色,地...
    独尊孤鹰阅读 168评论 0 0