不规则点分布的质心

时间:2015-08-17 11:12:00

标签: c++ opencv

我有一个“视觉上”形成一个闭合圆的点的图像。然而,这些点沿着这个“轮廓”不均匀地分布,这导致质心偏斜。我尝试使用findContours但是找不到封闭线。

有简单的解决方案吗?

编辑: 这些点存储在x和相应y坐标的矢量中,我使用cv::circle绘制它们。

图像:白色+红色=整个矢量(720点),红色=矢量的前半部分(360点)

enter image description here

原始图片:

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以使用minEnclosingCircle查找包含所有积分的最小圆圈。

您获得center作为函数的输出值:

void minEnclosingCircle(InputArray points, Point2f& center, float& radius)

<强>更新

我尝试了一些不同的东西。 我以为你知道你的最终形状是一个圆圈

  • minEnclosingCircle
  • boundingRect
  • fitEllipse

最佳结果(在此图片中)似乎是fitEllipse

<强>结果

minEnclosingCircle:

enter image description here

boundingRect:

enter image description here

fitEllipse:

enter image description here

代码:

#include <opencv2\opencv.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main()
{
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

    vector<Point> points;
    findNonZero(img, points);

    Mat3b res;
    cvtColor(img, res, CV_GRAY2BGR);

    //////////////////////////////////
    // Method 1: minEnclosingCircle
    //////////////////////////////////

    /*Point2f center;
    float radius;
    minEnclosingCircle(points, center, radius);

    circle(res, center, radius, Scalar(255,0,0), 1);
    circle(res, center, 5, Scalar(0,255,0), 1);*/


    //////////////////////////////////
    // Method 2: boundingRect
    //////////////////////////////////

    /*Rect bbox = boundingRect(points);

    rectangle(res, bbox, Scalar(0,255,255));
    circle(res, Point(bbox.x + bbox.width/2, bbox.y + bbox.height/2), 5, Scalar(0,0,255));*/


    //////////////////////////////////
    // Method 3: fit ellipse
    //////////////////////////////////

    RotatedRect ell = fitEllipse(points);
    ellipse(res, ell, Scalar(255,255,0));
    circle(res, ell.center, 5, Scalar(255,0,255));

    return 0;
}