Engine API学习笔记汇总.docx
《Engine API学习笔记汇总.docx》由会员分享,可在线阅读,更多相关《Engine API学习笔记汇总.docx(36页珍藏版)》请在冰豆网上搜索。
EngineAPI学习笔记汇总
EngineAPI学习笔记
软件概述
EngineAPI(应用程序接口)是Definiens软件开发工具包的一个组件。
EngineAPI可以通过插件来扩大DefiniensAnalysisEngineSoftware的容量。
一个Engine插件是有一个或者多个插件组件组成的。
一个插件组件也可以是实现一个算法或者功能,但二者不能同时实现。
此外EngineAPI用户指南提供使用EngineAPI的一般说明。
相关参考资料
在相关的EngineAPI参考帮助文档中,您将发现关于组成Engine插件程序的类和功能方面的详细信息,同时包括一些指导说明。
转到DefiniensDeveloper安装目录下的SDK文件夹。
默认路径C:
\ProgramFiles\DefiniensDeveloperVersionnumber\SDK\Engine\Help\
系统要求
通过DeiiniensEngineAPI开始编程的最低要求如下:
∙DefiniensDeveloper许可的版本.
∙MicrosoftVisualStudio.NET2003版本7.1
∙TheDefiniensDataIO应用程序编程接口(DIOAPI)头文件和.lib文件。
为了能够运行DefiniensDeveloper,在Windows系统上安装Definiens企业形象智能套件安装过程包括四个基本部分:
1.Definiens允许服务软件通过网络环境为Definiens软件提供许可证明,我们建议将它安装在DefinienseCognition网格的主节点上。
此外,你可以在一个网络环境中将它安装在另一台机器上。
这台机器需要在一个持续有效的网络段上。
2.在DefinienseCognition网格的主节点上安装DefinienseCognition网格基础结构软件。
DefinienseCognition网格为图像分析提供可升级服务的硬件和软件环境。
3.DefinienseCognitionEngine软件能够安装在DefinienseCognition网格中的主要点一个或者多个进程节点中。
4.一个或者多个Definiens企业形象智能客户端,它们代表了不同的基于角色的Definiens企业形象智能套件的用户界面。
注意
Definiens企业形象智能客户端不仅能被用在Windows操作系统上,一些组件在不同的版本例如Windows操作系统和Linux操作系统中也是可以适用的。
支持64位操作系统,尽管Definiens软件是一个本机32为应用程序,但是它兼容64位的软件和硬件。
这些系统表现出更优秀的操作系统内存管理,因此64位是DefinienseCognitionServer软件组件推荐的平台。
每个AnalysisEngineSoftware的安装需要2GB的RAM以及增加2GB的RAM给操作系统。
系统需求
CPU
RAM
显示
可以运行的平台
许可
最低
奔腾3
512M
Windows2000
Windowsxp.professionalSp4
WindowsxpprofessionalSp2
Windowsvista
WindowsServer2003
X86platforms
X86_64platforms
ForlinuxplatformsseethelinuxInstallationGruide
组件
系统需求
CPU
RAM
有效HD空间
显示
可以运行的平台
工作调度
部署服务器
管理控制台
最低/建议
inter奔4(3GHz,800FSB)或兼容
200M
1G/2G
1280*
1024
windows2000
WindowsxpprofessionalSp4
WindowsxpprofessionalSp2
Windowsvista
WindowsServer2003
X86platforms
X86_64platforms
ForlinuxplatformsseethelinuxInstallationGruide
组件
系统需求
CPU
RAM
有效HD空间
可以运行的平台
AnalysisEngine软件
控制服务
配置服务
最低
inter奔4(3GHz,800FSB)或兼容
1G
20G
Windows2000
Windowsxp.professionalSp4
WindowsxpprofessionalSp2
Windowsvista
WindowsServer2003
X86platforms
X86_64platforms
ForlinuxplatformsseethelinuxInstallationGruide
组件
系统需求
CPU
RAM
有效HD空间
可以运行的平台
Definiens视图
Definiens分析
Definiens设计
Definiens开发
最低
inter奔4(3GHz,800FSB)或兼容
1G
10G
windows2000
WindowsxpprofessionalSp4
WindowsxpprofessionalSp2
Windowsvista
WindowsServer2003
X86platforms
X86_64platforms
ForlinuxplatformsseethelinuxInstallationGruide
安装和配置
API是DefiniensDeveloper软件开发包(SDK)的一个组件,在安装DefiniensDeveloper时,SDK的安装是可选的。
如果你的电脑还没有安装SDK的话,需要跳转到DefiniensDeveloper的安装过程去。
在按照安装的顺序进行时,会遇到一个对话框选择组件,你不得不再SDK的复选框画上挑。
文件和安装目录结构
下面列出了包含DefiniensDeveloper安装信息的一些文件,并且与使用DataIOAPI有关。
跳转到SDK文件下面,即DefiniensDeveloper的安装目录,默认路径是:
C:
\ProgramFiles\DefiniensDeveloperVersionnumber\SDK\
帮助文件路径
\DataIO\Help\DataIOAPI_Help.chm
API头文件
.\Engine\Include\*.h
.\Engine\Include\AddinMngr\*.h
.\Engine\Include\DataIO\*.h
.\Engine\Include\Dbase\*.h
API库文件
.\Engine\Lib\DataIO.lib
.\Engine\Lib\Engine.lib
.\Engine\Lib\AddinMngr.lib
示例
.\Engine\Samples\SampleEPIAlgrSet
.\Engine\Samples\SampleEPIFeatureSet
DefiniensSoftware的theEnginePlug-ins的一体化
应用程序使用几个服务器同时读写文件和数据库,并且操作这些数据。
他们是在启动的时候进行加载。
他们以DLL's形式运行,能够被大致分为两类:
驱动器和插件。
加载项:
驱动和插件
我们有两种方式的加载项:
驱动和插件。
这两个概念性区别是驱动器主要处理硬件操作,比如文件访问(打开,关闭,读,写)和使用格式,反之,插件提供了功能函数,例如应用程序中的属性和可用的Engine算法,执行图像的操作是通过加载驱动程序来实现了。
载入添加模块
当应用程序启动时,首先加载驱动程序,然后加载插件。
四组驱动器(RDI,VDI,ADI,BDI)中的每一个都由一个单独的驱动器目录被载入的,Engine插件来自插件的目录。
每一个位置都包含一个已经被读取的xml配置文件和指定的被加载插件,这个搜索目录(bin/drivers或插件)在加载时被深入搜索。
如果通过配置发现被发现文件并没有被载入,他们就判断是否有效,有效的话,就载入。
以这种方式,如果没有按照载入顺序或者特殊的要求出现的话,插件能够被放在一个合适的目录来使用。
但是,如果加载项必须按照一定顺序的话,或者必须在初始化函数时通过一些可能的要求,或者一个可能被使用过的加载路径,被加载的应该在配置文件上面有所体现。
如果没有驱动器加载某一特定组,将会显示一个警告:
此主题相关图片如下:
图片1.png
载入插件模块
插件式Definiens软件的重要组成,他们根据提供的数据来进行转换,得到我们所需要的结果。
他们使用多种算法应用于图像分析和转换。
插件通过EnginePluginMngr被载入,载入的默认插件通过配置插件信息罗列出来。
他用xml文件来描述的插件载入顺序。
由于有一些插件在其他插件上面是独立的(创建好的Definiens)我们用一个特殊的顺序来定义一个插件列表。
例如:
DIAProcAlgr
DIAProcAlgrIntrn
DIAProcAlgrThmIntrn
DIAPropDscr
DIAPropDscrIntrn
DIAPropDscrIntrnVctr
这个文件的存储路径是bin/plugins。
如果某一个插件不能被载入,就会弹出这样一个消息对话框:
此主题相关图片如下:
图片2.png
按照配置列表加载插件以后,应用程序尝试在插件目录中载入一些其他的.Dll,这时发生错误的话,不会弹出任何对话框。
成功加载插件取决于拥有一个特殊的导出插件的功能,如果这些功能中的任何一个都无效的话,插件就不会被加载,被载入的驱动和插件能够在帮助里面看到->SystemInfoDialogbox。
所有的插件必须导出以下三种功能:
EPI_PLUGINintEPIGetVersionMinor()
EPI_PLUGINintEPIGetVersionMajor()
EPI_PLUGINEPIPlugin*EPIGetPlugin()
一个具有初始化功能的插件也可以导出成一个EnginePlug-in。
EPI_PLUGINboolEPIInit(),如果当前这个功能返回一个错误的返回值,这个插件是不能被加载的。
配置
负载载入的顺序按照xml配置文件规定的来进行。
也就是说,第一个标注将会被加载进来,最后一个标注则最后被加载。
这里有两个属性标记,是可选的。
use_path这个属性的特点是增加的应该从被给出use_path的文本里面来加载。
这是一个绝对路径,或者相对路径本身。
如果没有use_path,增加的就是从增加的路径里面来加载。
Init_args这个属性的特点是字符串问题,即应当通过加载项的初始化函数(DataIO驱动器的XDI_Driver_Init)驱动器,和Engine插件的EPInit。
解析一个EnginePlug-in
创建一个EngineAPI让开发变得更容易,可以快速访问信息和所需资源,以此来创建一个DefiniensEnginePlug-in。
一个EnginePlug-in是由一个或多个组件组成。
一个组件既能运行一条属性或者一个算法,但不能同时运行二者。
当你在你的Engine插件里面设计完你的第一个算法之后,你所启动的位置就是执行导出接口函数和基本的EPIPlug-in接口类。
OptionalDLLExports
EPI_PLUGINboolEPIInit();
EPI_PLUGINvoidEPIFinalize();
MandatoryDLLExports
EPI_PLUGINintEPIGetVersionMinor();
EPI_PLUGINintEPIGetVersionMajor();
EPI_PLUGINEPIPlugin*EPIGetPlugin();
classENGINE_APIEPIPlugin
{
public:
virtualEPIComponentInfo**GetComponentList()const=0;
virtualconstchar*GetPlugInLicenceId()const{
return"";}
virtualconstchar*GetPlugInLicenceVer()const{
return"";}
virtualconstchar*GetName()const=0;
virtualconstchar**GetLegacyGUIDList()const{
returnNULL;}
};
首先,如果非强制功能函数boolEPIInit()被导出,即调用。
如果返回值错误,并且没有在插件上做进一步的查询,EnginePluginMngr试图去载入下一个插件。
如果EPIInit函数并没有存在,只有这个强制性导出功能被检测。
如果插件是有意义的,Definiens软件将会调用你的插件导出功能函数来找到相关插件信息,以及如何去使用它。
然后会调用EPIGetPlugin()函数,这个EPIGetPlugin()函数将会返回一个实例化你的类的指针,该类运行虚函数类EPIPlugin。
当DefiniensSoftware获得一个该类指针,他就会找到更多关于执行你的插件的有用信息(包括许可信息)。
如果所有都执行顺利,他将调用功能EPIPlugin:
:
GetComponentList()和类EPIComponentInfo指针的数组。
这些EPIComponentInfo指针指向实例对象,包括了一些关于算法的信息,并且和组件类型也有关联。
以这种方式你的插件能运行多种功能(通过EPICComponentInfo*list),EPIComponentInfo**GetComponentList()const你的EPIComponentInfo类的执行必须覆盖纯虚函数:
EPIComponent*EPIComponentInfo:
:
CreateComponent(DMIProject*project);
这个功能将会返回一个实际的EnginePlug-inComponents(类EPIComponent)运行过程,或者是一个属性组件,或者是一个算法过程组件。
属性组件和算法组件
你可以创建两种类型的插件:
属性组件和算法组件。
AnalysisEngineSoftware允许我们进行两种操作,通过这两类组件。
属性组件是属性对象和场景的一个接口,这些接口允许应用程序检索关于图像的详细信息,或者图像段。
一个示例执行的功能范围可能会被限制在x,y范围内,但是这个例子很简单或者没有处理。
通常功能组件也为复杂的检索提供了接口,这可能需要一些处理,例如取平均值,或者某些图像对象,形状信息,相对于其他物体的距离。
算法组件允许我们运行图像和对象的功能,这些可能的运行是有条件的,可能受到属性控制。
算法的执行部分可能会软化或者锐化图像算法,或者在Definiens软件中常见见的一个算分割,他在一些threshold的基础上将图像分割。
一个非常简单的例子,是利用分割算法来浏览一个图像,使分割部分加入具有相同红/蓝/绿像素值的像素块,当然这是一个非常简单的分割像素图,在实际图像中将会没有一点用处,然而,这一点是十分明确的。
Definiens软件中的算法组件是技术的核心,利用他们可以做强大的事情,使用EngineAPI来实现你的Definiens软件的算法组件一体化。
执行一个算法组件
要创建一个算法有以下几步:
1.必须告诉DefiniensApplication我们正在运行哪一种组件。
2.在我们推导EPIComponentInfoECompType的算法时,需要我们去运行纯虚函数EPIComponentInfo:
:
GetComponentType()const。
3.从这个功能上,我们返回EPIComponentInfo:
:
CompID_ProcAlgr的类型。
也就是说Definiens软件就是我们正在运行的一款软件。
4.提供Definiens软件一种处理这个组件的运行过程,也就是说我们必须要:
写一个运行函数抽象类EPIProcAlgr
在我们推导EPIComponentInfo算法时,需要我们去运行纯虚函数EPIComponentInfo:
:
CreateComponent(DMIProject*project
从功能上来讲,运行类EPIProcAlgr的一个实例,返回一个EPIProcAlgr的指针。
类EPIProcAlgr是一个抽象类,他包含一个或多个纯虚函数,纯虚函数必须被覆盖,否则派生类不能实例化。
其他的在抽象类中纯虚函数是不能被运行的。
这是一个boolEPIProcAlgr:
:
AlgrExecBgn(DMIProcessContext*cntxt)功能的例子。
一个具有最少的运行程序来运行:
EPIComponent:
:
Delete
EPIComponent:
:
GetInfo
EPIParamContainer:
:
GetParam
EPIParamContainer:
:
SetParam
EPIProcAlgr:
:
AlgrInit
EPIProcAlgr:
:
AcceptChildProcess
EPIProcAlgr:
:
SupportsDomain
EPIProcAlgr:
:
GetAutoName
EPIProcAlgr:
:
AlgrExecBgn
EPIProcAlgr:
:
AlgrExec
EPIProcAlgr:
:
AlgrExecEnd
EPIProcAlgr:
:
AlgrDone
HelloWorld插件的开发
插件和组件,这是两个独立的的概念。
基本上,一个插件可以包含一个或多个相关的组成部分。
每个部分实现了功能的原子化,可以选择Definiens软件中独立窗口下的进程树。
执行插件
我们创建了最高级别的从EPIPlugin类继承的Engine接口类,我们需要实现纯虚函数的功能GetComponentList和GetName,其他默认的直接就可以使用。
classEPI_PLUGINMyFirstPlugin:
publicEPIPlugin
{
public:
//!
getnull-terminatedlistofcomponents
EPIComponentInfo**GetComponentList()const;
//!
getthenameoftheplug-in,fordisplaypurposesonly
constchar*GetName()const{return"MyFirstPlugin";}
};
下面我们创建一个文件:
MyFirstPlugin.Cpp
这里我们运行基本的EnginePlug-in的功能,并在头文件中声明MyFirstPlugin:
:
GetComponentList功能
在这个MyFirstPlugin:
:
GetComponentList()功能里,我们提供了一个空的终止条件列表的一个静态实例。
在我们的案例中,列表只有一个组件成为了我们的插件。
过后,我们的组件列表可能增加到包括了许多东西。
然后,通常的一个单纯的插件将会仅仅包含一些相关的组件。
如你所见,GetComponentList函数返回的列表中包括了类UpdateProcVar的使用。
这个类包括了我们新的插件组件的运行方式。
这个新类我们将在每一个组件的头文件中声明UpdateProcVar.H。
大多数的创建一个插件的工作都在组件开发中实现。
//!
getthemajorversionnumberofthisplug-in
intEPIGetVersionMajor()
{
return1;
}
//!
gettheminorversionnumberofthisplug-in
intEPIGetVersionMinor()
{
return0;
}
//!
returnstheinstanceofthestaticallyinstancitateddll-plug-in
EPIPlugin*EPIGetPlugin()
{
staticMyFirstPluginplugin;
return&plugin;
}
EPIComponentInfo**MyFirstPlugin:
:
GetComponentList()const
{
//----------------------------------------
//Listofallimplementedcomponents
//----------------------------------------
staticEPIComponentInfo*list[]=
{
UpdateProcVar:
:
GetInfoStatic(),
N