聚类方法实现字符和对象分割

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

首先是头文件。下面文件可以直接编译成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[

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值