您的位置:首页 > 其它

Halcon学习之高斯混合模型

2015-09-24 21:13 531 查看
void testGaussMixtureModels()
{
//创建一个高斯混合模型对象
//参数说明: NumDim特征空间的维度数量,  NumClasses高斯混合模型的类别数目,  NumCenters每个类的中心数目,
//CovarType协方差矩阵的类型, Preprocessing用来转化特征向量的预处理类型, NumComponents预处理参数:转化特征的数目, RandSeed产生随机数的种子值,用来初始化高斯混合模型
Hlong NumDim=3, NumClasses=3, NumCenters=1;
HString CovarType = "spherical", Preprocessing = "normalization";
Hlong NumComponents = 10, RandSeed = 42;

HClassGmm classGmm;
classGmm.CreateClassGmm(NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed);

//添加一幅图像到高斯混合模型的训练数据
//参数说明: ClassRegions选择的图像中对象区域, GMMHandle高斯混合模型句柄,Randomize添加的高斯噪声在训练数据中的标准差
HRegion ClassRegions;
double Randomize=1.0;
HImage fruit("fruit.jpg");
Hlong width, height;
fruit.GetImageSize(&width, &height);
HWindow fruitWin(0, 0, width, height);
fruitWin.DispColor(fruit);
fruitWin.SetColor("red");//设置窗口字体颜色
ClassRegions = fruitWin.DrawRegion();
ClassRegions = ClassRegions.ConcatObj(fruitWin.DrawRegion()).ConcatObj(fruitWin.DrawRegion());//选三类图片对象
fruit.AddSamplesImageClassGmm(ClassRegions, classGmm, Randomize);//添加图像中选定的对象到高斯混合模型中

//训练一个高斯混合模型
//参数说明: MaxIter,Threshold终止期望最大的错误相对改变的阈值,  ClassPriors指定计算先验类的方法,  Regularize放置协方差奇异的正规值,Centers发现每个类中心的数量, Iter每个类执行迭代的数量
Hlong MaxIter=10;
double Threshold=0.001;
HString ClassPriors = "training";
double Regularize=0.0001;
HTuple Centers;
HTuple Iter;
Centers = classGmm.TrainClassGmm(MaxIter, Threshold, ClassPriors, Regularize, &Iter);

//通过一个高斯混合模型对一个图像进行分类
//参数说明:GMMHandle高斯混合模型句柄,  RejectionThreshold拒绝分类的阈值
double RejectionThreshold = 0.5;
HRegion region=fruit.ClassifyImageClassGmm(classGmm, RejectionThreshold);
fruitWin.SetColor("blue");
fruitWin.DispRegion(region);
fruitWin.Click();

//高斯混合模型序列化与反序列化
HSerializedItem item = classGmm.SerializeClassGmm();
HClassGmm serialclassGmm;
serialclassGmm.DeserializeClassGmm(item);

//高斯混合模型写入和读出文件
classGmm.WriteClassGmm("classGmm.ggc");
HClassGmm fileclassGmm;
fileclassGmm.ReadClassGmm("classGmm.ggc");

//高斯混合模型样本数据写入和读出文件
classGmm.WriteSamplesClassGmm("classSampleGmm");
HClassGmm filesampleclassGmm;
filesampleclassGmm.CreateClassGmm(NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed);//必须先创建,不然调用出错
filesampleclassGmm.ReadSamplesClassGmm("classSampleGmm");

//获得高斯混合模型中的训练数据
HClassTrainData classTrainData = classGmm.GetClassTrainDataGmm();

//返回高斯混合模型的参数
//参数说明: NumDim特征空间维度数,  NumClasses高斯混合模型的分类数,  MinCenters每个高斯混合模型类的中心最小数,  MaxCenters每个高斯混合模型类的中心最大值, CovarType协方差的类型
Hlong NumDim1,NumClasses1;
HTuple MinCenters1, MaxCenters1;
HString CovarType1;
NumDim1 = classGmm.GetParamsClassGmm(&NumClasses1, &MinCenters1, &MaxCenters1, &CovarType1);
cout << "特征空间维度数:  " << NumDim1 << "   分类数: " << NumClasses1 <<endl<< "  类的中心最小数:  " << (double)MinCenters1 << "   类的中心最大值:  " << (double)MaxCenters1 << "  协方差的类型:  " << (HString)CovarType1 << endl;

//计算预处理高斯混合模型的特征向量的信息内容
//参数说明:Preprocessing用来转换特征向量的预处理类型,InformationCont转换特征向量的相对信息内容,CumInformationCont转换特征向量的累积信息内容
HString Preprocessing1 = "principal_components";
HTuple InformationCont, CumInformationCont;
InformationCont = classGmm.GetPrepInfoClassGmm(Preprocessing1, &CumInformationCont);

//从高斯混合模型的训练数据中返回一个训练样本
Hlong NumSample=0;
HTuple Features;
Hlong ClassID;
Features = classGmm.GetSampleClassGmm(NumSample, &ClassID);
cout << endl;
cout << "ClassID: " << ClassID << endl;

//返回存储在高斯混合模型中训练数据的训练样本个数
Hlong NumSample1;
NumSample1 = classGmm.GetSampleNumClassGmm();
cout << endl;
cout << "训练样本个数: " << NumSample1 << endl;

//清除高斯混合模型的训练数据
classGmm.ClearSamplesClassGmm();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: