如何在opencv(c ++)中计算标记组件(二进制图像)之间的成对距离

时间:2017-02-20 06:28:39

标签: c++ opencv image-processing nearest-neighbor

我有二进制图像,我在这里显示:

enter image description here

我通过使用opencv函数成功计算了此图像中所有白点的质心和统计数据:connectedComponentsWithStats,信息链接在这里:

connectedComponentsWithStats

现在我必须计算所有白点(成对)距离之间的所有距离。我的问题是:

在opencv(c ++)中计算白点的成对距离的最简单方法是什么?我在Python中读过k-Nearest Neighbor但我不知道如何在c ++中实现它。计算好距离后,我必须将每两个点的颜色调整得比某个值更接近,例如,如果两个点的距离小于10 px,则应将它们标记为红色(否则为绿色)

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用两个循环和标准的欧氏距离公式自己完成。可以使用掩码设置setTo完成着色,其中值匹配当前循环索引

cv::Mat centorids, connectedComponentsLabels;
connectedComponentsWithStats(image, connectedComponentsLabels, stats, centroids, 8, CV_32S);
cv::Mat resultsImage = cv::Mat::zeros(connectedComponentsLabels.size(), CV_8UC3);
resultsImage.setTo(cv::Scalar(0, 255, 0), connectedComponentsLabels != 0); //precolor all points green, so that red coloring can override it
for (int i = 1; i < centroids.rows - 1; ++i)
{
    for (int j = i + 1; j < centroids.rows; ++j)
    {
        auto vec = cv::Point2d(centroids.at<double>(i, 0), centroids.at<double>(i, 1)) - 
                   cv::Point2d(centroids.at<double>(j, 0), centroids.at<double>(j, 1));
        double distSquared = vec.x * vec.x + vec.y * vec.y;
        if (distSquared > 100) //compare with 10 squared to avoid slow sqrt for distance
        {   //do the coloring red here
            resultsImage.setTo(cv::Scalar(255, 0, 0), connectedComponentsLabels == i);
            resultsImage.setTo(cv::Scalar(255, 0, 0), connectedComponentsLabels == j);
        }
    }
}