2.4メモリ管理
3027 ワード
すべての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つ目は、2.1節、stringタイプの出力パラメータを参照して、メモリを明示的に割り当てる必要があります.
2つ目は、プロシージャ向けメソッドでハンドルを呼び出す場合です.open_を使用するなど、ハンドルを作成する場合です.framegrabberメモリ割り当ては、close_のようなプログラムの最後に対応する演算子でメモリを解放する必要があります.framegrabber.
2.5オブジェクト指向コードとプロセス指向コードの組み合わせ
前述したように,オブジェクト向けのプログラミング手法を可能な限り使用することを推奨する.しかし,いくつかの理由でプロセス向けの方法を用いた.たとえば、HDevelopからエクスポートされたコードを迅速に統合したい場合は、プロセス向けの方法しか使用できません.それ以外に、現在の状況では、シミュレーション変換演算子像vector_を作成するなど、プロセス向けの方法しか提供していない演算子もあります.to_ragid.
画像化されたパラメータとハンドルは、次のように変換できます. Hobjectをグラフィカルパラメータクラス に変換する
グラフィックス化されたパラメータはHobjectから例えばHImageに変換でき,このプロセス化された変数をパラメータの構築関数として簡単に呼び出すだけでよい.ハンドルをハンドルクラス に変換する.
ハンドルはコンストラクション関数で直接変換することはできませんが、SetHandle()を使用して変換できます.変換ハンドルクラスはハンドル である.
同様に、1つのハンドルは対応するクラスからGetHandle()で取得できます.この方法は無視できます.したがって、ハンドルクラスは強制変換演算子を提供し、自動的にハンドルに変換できます.変換グラフィカルパラメータクラスはHobject
グラフィックスパラメータは、メソッドId()を呼び出すだけでHRegionのようなクラスからHobjectに変換できます. HWindowをウィンドウハンドル に変換
他のハンドルとは異なり、プロシージャ向けウィンドウハンドルはHWindowクラスのオブジェクトに変換できません!しかし、HWindowからWindowHandle()でハンドルを抽出することができます.
章「アナライザとHalcon演算子」で述べたようにclear_shape_model,clear_all_shape_models,or close_framegrabberは、対応するハンドルクラスとともに使用されます.
2.6 I/O Streams
HALCON 7.1からhalcon/c++は、いくつかのプロジェクトが古い入出力ストリームを使用したい(すなわち、使用したいのではなく、使用したい)ため、入出力ストリーム演算子を提供しなくなった.
後方互換性のため、HTupleのIO演算子はインライン関数として提供する、ヘッダファイルHIOStreamに存在する.h.HIOStream.hデフォルトでは新しいインタフェースが使用されますが、USE_IOSTREAM_HはHIOStreamです.h以前に含む、古いバージョンが使用される.注意、using namespace stdが含まれています.必要かもしれません.
IOストリームを使用するためにHalconCppをお勧めします.h後に以下の行を挿入する.
しかし、メモリを明示的に管理する必要がある場合は2つあります.1つ目は、2.1節、stringタイプの出力パラメータを参照して、メモリを明示的に割り当てる必要があります.
2つ目は、プロシージャ向けメソッドでハンドルを呼び出す場合です.open_を使用するなど、ハンドルを作成する場合です.framegrabberメモリ割り当ては、close_のようなプログラムの最後に対応する演算子でメモリを解放する必要があります.framegrabber.
2.5オブジェクト指向コードとプロセス指向コードの組み合わせ
前述したように,オブジェクト向けのプログラミング手法を可能な限り使用することを推奨する.しかし,いくつかの理由でプロセス向けの方法を用いた.たとえば、HDevelopからエクスポートされたコードを迅速に統合したい場合は、プロセス向けの方法しか使用できません.それ以外に、現在の状況では、シミュレーション変換演算子像vector_を作成するなど、プロセス向けの方法しか提供していない演算子もあります.to_ragid.
画像化されたパラメータとハンドルは、次のように変換できます.
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();
同様に、1つのハンドルは対応するクラスからGetHandle()で取得できます.この方法は無視できます.したがって、ハンドルクラスは強制変換演算子を提供し、自動的にハンドルに変換できます.
p_barcode=o_barcode;
Hobject p_code_region = o_code_region.Id();
グラフィックスパラメータは、メソッドId()を呼び出すだけでHRegionのようなクラスからHobjectに変換できます.
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++は、いくつかのプロジェクトが古い入出力ストリームを使用したい(すなわち、使用したいのではなく、使用したい)ため、入出力ストリーム演算子を提供しなくなった.
後方互換性のため、HTupleのIO演算子はインライン関数として提供する、ヘッダファイルHIOStreamに存在する.h.HIOStream.hデフォルトでは新しいインタフェースが使用されますが、USE_IOSTREAM_HはHIOStreamです.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