首先是头文件。下面文件可以直接编译成DLL。主函数是cluseterMethod。
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
#include <string>
#include <vector>
#include "opencv2/opencv.hpp"
MYDLL_API void cluseterMethod(cv::Mat lenaImg, std::vector<cv::Rect>& rects);
CPP文件,MyDLL.cpp。这里包含了MyDLL.h等头文件。头文件包括了Mat所用的HPP文件。
#include "MyDLL.h"
MYDLL_API float getDistance(cv::Point3f t1, cv::Point3f t2)
{
double dx = powf((t1.x - t2.x), 2);
double dy = powf((t1.y - t2.y), 2);
double dz = powf((t1.z - t2.z), 2);
return sqrt(dx + dy + dz);
};
//根据质心,决定当前元组属于哪个簇
MYDLL_API int class_inputdata(cv::Point3f means[], cv::Point3f tuple)
{
float dist = getDistance(means[0], tuple);
float tmp;
int label = 0;//标示属于哪一个簇
for (int i = 1; i < CLUSTERCNT; i++)
{
tmp = getDistance(means[i], tuple);
if (tmp < dist)
{
dist = tmp;
label = i;
}
}
return label;
};
//获得当前簇的均值(质心)
MYDLL_API cv::Point3f getMeans(std::vector<cv::Point3f> cluster)
{
double num = cluster.size();
cv::Point3f t;
for (double i = 0; i < num; i++)
{
t.x += cluster[i].x;
t.y += cluster[i].y;
t.z += cluster[i].z;
}
t.x /= num;
t.y /= num;
t.z /= num;
return t;
};
//获得给定簇集的平均误差
MYDLL_API float getVar(std::vector<cv::Point3f> clusters[], cv::Point3f means[])
{
float var = 0;
float count = 0;
for (int i = 0; i < CLUSTERCNT; i++)
{
std::vector<cv::Point3f> t = clusters[i];
for (int j = 0; j < t.size(); j++)
{
count++;
var += getDistance(t[j], means[i]);
}
}
return var / count;
};
//检查当前初始点是否与已有点重复
//重复 返回true
//不重复 返回false
MYDLL_API int check_repeat(cv::Point3f means[

本文档展示了如何使用K均值聚类算法实现字符和对象分割。代码包括了计算距离、确定簇归属、获取质心、计算平均误差等功能,并通过连接组件进一步处理结果,以识别和分割图像中的字符或对象。最后,提供了调用该功能的示例程序。
最低0.47元/天 解锁文章
28

被折叠的 条评论
为什么被折叠?



