在OpenCV C++中找到轮廓到点的距离

3

我会创建一个矩阵,在列[i]中包含从轮廓的固定点(质心mc(i))到轮廓点[i]的距离。

以下是我查找轮廓和质心的代码:

findContours(binMat, contours, cv::RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0,0));

/// Get the moments
vector<Moments> mu(contours.size());
for (int i = 0; i < contours.size(); i++)
{
    mu[i] = moments(contours[i], false);
}

///  Get the mass centers
vector<Point2f> mc(contours.size());
for (int i = 0; i < contours.size(); i++)
{
    mc[i] = Point2d(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
}

这段代码运行良好。

接下来,我尝试了多种方式来寻找距离,但由于我是新手在使用C++和OpenCV进行编程,遇到了许多问题。

2个回答

1

感谢Aidenhjj的快速回复!我已经尝试了那个函数,它可以工作,但是我需要知道轮廓上每个点到质心的距离!而这个函数只返回轮廓上最近点的距离。 - Marco Pettinari
只需获取每个点的x和y属性,减去中心点的x和y,然后使用古老的勾股定理来计算距离。 - Aidenhjj
这就是关键!我已经在Matlab上完成了这个项目,那里我使用了“古老而好用的勾股定理” :) 事实是,因为这是我第一次使用C++/openCV编程,所以我不知道如何获取x和y属性! - Marco Pettinari
我认为如果您循环遍历轮廓向量,您应该得到openCV Points。要访问x和y属性,只需执行pt.xpt.y即可。但是我一直在使用Python API。 - Aidenhjj

1
for (int i = 0; i < contours.size(); i++)
{
    mc[i] = Point2d(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);

    KeyPoint k;
    k.pt = mc[i];

    float d = (k.pt.x,k.pt.y, centerX,centerY);
}

一个计算两点之间距离的函数

float distance(int x1, int y1, int x2, int y2)
{

    float d = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));

    return d;
}

1
谢谢Ibrahim!你的建议很有用,我是这样解决问题的:vector<Point2f> mc(contours.size()); raggio.resize(contours.size()); for (int i = 0; i < contours.size(); i++) { mc[i] = Point2d(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00); KeyPoint center; center.pt = mc[i]; raggio[i].resize(contours[i].size()); for (int j = 0; j < contours[i].size(); j++) { KeyPoint k; k.pt = contours[i][j]; float d = distance((int)center.pt.x, (int)center.pt.y, (int)k.pt.x, (int)k.pt.y); raggio[i][j] = d; } } - Marco Pettinari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接