【IDL】C#调用ENVI_FX_SEGMENTONLY_DOIT需要注意的地方
发表于 2012-12-13
随着ENVI 5.0的发布,ENVI中的个别库函数也随之改变。比如取消了面向对象特征提取函数ENVI_FX_DOIT,取而代之的是以下三个函数:
- ENVI_FX_SEGMENTONLY_DOIT (Segment Only Feature Extraction)
- ENVI_FX_RULEBASED_DOIT (Rule Based Feature Extraction)
- ENVI_FX_EXAMPLEBASED_DOIT (Example Based Feature Extraction)
下面以 ENVI_FX_SEGMENTONLY_DOIT 函数为例进行介绍。
在VS中使用COM_IDL_Connect方法调用ENVI_FX_SEGMENTONLY_DOIT函数时,会有很大可能弹出如下错误,或者不弹出错误又不执行DOIT过程,而继续执行下面的代码。
下面总结出三个需要注意的地方,一般就不会出错了。
1. 首先确保ENVI许可包含FX功能模块(即面向对象信息提取);
2. 确保添加的引用至少为IDL 8.2版本,验证方法见C#示例代码;
3. 在IDL的PRO源码中,添加下面的代码
PRO ENVI_FX_SEGMENTONLY_DOIT_RECORD, _extra = extra
END
注:调用ENVI_FX_RULEBASED_DOIT 和ENVI_FX_EXAMPLEBASED_DOIT 函数时,同样需要注意以上三个地方的
当系统安装了多个版本的IDL,在VS中添加引用时,会有多个COM_IDL_connectLib可以选择,如果不小心将IDL其他版本的引用添加进去后,仅仅移除再重新添加8.2的引用是无效的。解决方法如下:
1. 选中引用中的COM_IDL_connectLib,查看其“路径”属性;
2. 找到对应路径下的Interop.COM_IDL_connectLib.dll文件,手动将其删除;
3. 重新添加IDL8.2引用即可。
C#示例如下:
COM_IDL_connectLib.COM_IDL_connectClass oCom = new COM_IDL_connectLib.COM_IDL_connectClass();
oCom.CreateObject(0, 0, 0)
//当机器内安装多个IDL版本时,建议首先使用如下语句确定IDL版本号
oCom.ExecuteString("void = dialog_message(!version.release)");
oCom.ExecuteString(".compile " + @"'D:\IDLWorkspace82\Default\test_fx_segmentonly_doit.pro'");
oCom.ExecuteString("test_fx_segmentonly_doit");
IDL代码示例如下:
;注意添加此过程代码
PRO ENVI_FX_SEGMENTONLY_DOIT_RECORD, _extra = extra
END
PRO TEST_FX_SEGMENTONLY_DOIT
COMPILE_OPT IDL2
CATCH, Error_status
;判断是否出现错误
IF Error_status NE 0 THEN BEGIN
Void = DIALOG_MESSAGE(!ERROR_STATE.MSG,title ='错误信息!',/error)
CATCH, /CANCEL
RETURN
ENDIF
ENVI, /restore_base_save_files
ENVI_BATCH_INIT
;输入输出文件,根据需要修改
file = 'C:\Program Files\Exelis\ENVI50\classic\data\bhtmref.img'
SegImage = 'D:\temp\bhtmref_Seg.dat'
ENVI_OPEN_FILE, file, r_fid = fid
ENVI_FILE_QUERY, fid, dims = dims, nb = nb
pos = LINDGEN(nb)
IF (FID EQ -1) THEN BEGIN
ENVI_BATCH_EXIT
RETURN
ENDIF
ENVI_DOIT, 'envi_fx_segmentonly_doit', $
fid=fid, pos=pos, dims=dims, $
r_fid=r_fid, $
merge_level=90.0, $
scale_level=40.0, $
segmentation_raster_filename=SegImage
!Null = DIALOG_MESSAGE('成功了!', /info)
;这种调用ENVI函数的方法,不需要ENVI_BATCH_EXIT
;ENVI_BATCH_EXIT
END
原始图像与运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界