PIE SDK 监督分类对话框类(SupervisedClassificaitonDialog)使用经验

        最近研究遥感,用到分类算法,PIE SDK正好提供了一些方法可供调用,他们的官方博客上也有相应的示例代码(可参考:https://www.cnblogs.com/PIESat/p/10725270.html)。但是,我在开发手册中发现了监督分类对话框类(SupervisedClassificaitonDialog),欣喜若狂!心想有这个类的话,不仅有直观的界面展示,而且也会省去很多开发过程。不幸的是,直接调用这个类显示参数设置对话框界面(如下图),设置好参数,点击OK,并没有出现我想要的分类结果。实际上是根本就没有执行分类算法。因此,我咨询了相关技术人员(在此表示感谢),终于试验成功,特此Mark一下。

       监督分类对话框类界面

       我们知道PIE SDK算法调用有三步:

       第一步:设置ROI统计参数ROIStatistics_Exchange_Info并执行ROI统计算法得到ROI统计信息。

       第二步:根据roi统计信息设置监督分类参数SupervisedClassification_Exchange_Info并执行距离分类算法。

       第三步:结果显示。

       在监督分类对话框类中,可以设置ROI。设置ROI后,就已经完成了ROI信息统计,不再需要执行ROI统计算法。至此,第一步已经完成。

       在第二步中,需要设置监督分类参数SupervisedClassification_Exchange_Info。来看SupervisedClassificaitonDialog的Public成员函数(如下图)。

SupervisedClassificaitonDialog的Public成员函数

       其中有GetParams()函数,第一想到的是它可以获得参数以完成第二步监督分类参数SupervisedClassification_Exchange_Info结构体的设置。但是这个函数使用上有一点技巧(我一直卡在这个地方),如下:

1 SupervisedClassification_Exchange_Info m_DataInfo = null;
2             m_DataInfo = new SupervisedClassification_Exchange_Info(max_likelihood.GetParams());
View Code

       至此,通过SupervisedClassificaitonDialog显示参数设置对话框界面,设置好参数后,即可完成第二步监督分类参数SupervisedClassification_Exchange_Info结构体的构造。

       下面就开始执行算法获取想要的结果了!!!

       完整代码如下:

 1 private void toolStripButton1_Click_1(object sender, EventArgs e)
 2         {
 3             SupervisedClassificaitonDialog max_likelihood = new SupervisedClassificaitonDialog();
 4             max_likelihood.Initialize(0, mapControlMain.FocusMap);
 5             
 6             if (max_likelihood.ShowDialog()!=1)
 7             {
 8                 max_likelihood.Dispose();
 9                 max_likelihood = null;
10                 return;
11             }
12             SupervisedClassification_Exchange_Info m_DataInfo = null;
13             m_DataInfo = new SupervisedClassification_Exchange_Info(max_likelihood.GetParams());
14 
15             ISystemAlgo maxlikelihoodAlgo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.MLClassificationAlgo");//最大似然法就将DistanceClassificationAlgo替换为MLClassificationAlgo
16             maxlikelihoodAlgo.Name = "最大似然分类";
17             if (max_likelihood == null) return;
18             maxlikelihoodAlgo.Params = m_DataInfo;
19             ISystemAlgoEvents systemEvents = maxlikelihoodAlgo as ISystemAlgoEvents;
20             systemEvents.OnExecuteCompleted += systemEvents_OnExecuteCompleted;
21             
22 
23             AlgoFactory.Instance().ExecuteAlgo(maxlikelihoodAlgo);
24             max_likelihood.Dispose();
25             max_likelihood = null;
26         }
View Code

SupervisedClassificaitonDialog参数设置对话框

分类结果展示

       有不对的地方请大家批评指正。

2019.8.27更新(添加systemEvents_OnExecuteCompleted代码):

 1          /// <summary>
 2         /// 算法执行完成事件
 3         /// </summary>
 4         /// <param name="algo"></param>
 5         void systemEvents_OnExecuteCompleted(ISystemAlgo algo)
 6         {
 7             ISystemAlgoEvents systemEvents = algo as ISystemAlgoEvents;
 8             systemEvents.OnExecuteCompleted -= systemEvents_OnExecuteCompleted;
 9             ILayer layer = LayerFactory.CreateDefaultLayer(@"F:ackupSourceCodePIEPIEMapApplication1Pie_class.img");
10             if (layer == null)
11             {
12                 System.Windows.Forms.MessageBox.Show("分类后图层为空");
13                 return;
14             }
15             mapControlMain.ActiveView.FocusMap.AddLayer(layer);
16             mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
17         }
18         
View Code
原文地址:https://www.cnblogs.com/LW-MA/p/10952872.html