Halcon学习之高斯混合模型

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();
}

你可能感兴趣的:(knn,高斯混合模型,halcon)