【IDL】 C#调用ENVL_FX_SEGMENTONLY_DOIT需要注意的地方

随着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

 

原始图像与运行结果:

 

posted @   地理遥感生态网平台  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示