我有二进制图像,我在这里显示:
我通过使用opencv函数成功计算了此图像中所有白点的质心和统计数据:connectedComponentsWithStats,信息链接在这里:
现在我必须计算所有白点(成对)距离之间的所有距离。我的问题是:
在opencv(c ++)中计算白点的成对距离的最简单方法是什么?我在Python中读过k-Nearest Neighbor但我不知道如何在c ++中实现它。计算好距离后,我必须将每两个点的颜色调整得比某个值更接近,例如,如果两个点的距离小于10 px,则应将它们标记为红色(否则为绿色)
答案 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);
}
}
}