BM算法及原理不是很懂,先上一个实例代码。
// 训练分类器
Ptr<EM> em_model = EM::create();
em_model->setClustersNumber(N);
em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);
em_model->setTermCriteria(TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 10000, 0.1));
em_model->trainEM(sampleM, noArray(), noArray(), noArray());
//对每个坐标点进行分类,并根据类别用不同的颜色画出
Mat sample(1, 2, CV_32FC1);
Mat out(src.size(), CV_8UC3);
for (int i = 0; i < sampleCount; i++)
{
sample.at<float>(0) = (float)cvRound(points[i].x);
sample.at<float>(1) = (float)cvRound(points[i].y);
int response = cvRound(em_model->predict2(sample, noArray())[1]);
Scalar c = colors[response]; //为不同类别设定颜色
circle(out, Point(cvRound(points[i].x), cvRound(points[i].y)), 1, c*0.75, FILLED);
}
imshow("clusters", out);
cv::waitKey(0);
效果图如下,距离间隔大效果较好。