【问题标题】:Find parameters of ellipse through contour moments in OpenCV在OpenCV中通过轮廓矩找到椭圆的参数
【发布时间】:2014-04-18 15:36:45
【问题描述】:

我的程序中有这段代码:

findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
for(int i = 0; i < contours.size(); i++){
    if(hierarchy[i][3] >=0 && arcLength(contours[i], true) > 240){
        Moments mu =  moments(contours[i], false);
        Point2d mc(mu.m10/mu.m00, mu.m01/mu.m00);
        double m11 = mu.m11 / mu.m00;
        double m20 = mu.m20 / mu.m00;
        double m02 = mu.m02 / mu.m00;
        double orientation = 0.5*atan(2*m11 / (m20 - m02));
        double lambda1 = (m20 + m02)/2 + sqrt(4*m11*m11 - (m20 - m02)*(m20 - m02));
        double lambda2 = (m20 + m02)/2 - sqrt(4*m11*m11 - (m20 - m02)*(m20 - m02));
        cout << "labmda1: " << lambda1 << endl << "labmda2: " << lambda2 << endl;
        cout << "orientation: " << orientation << endl << "mc: " << mc << endl << endl;
        //ellipse(drawing_ellipses, mc, Size(lambda2, lambda1), orientation, 0, 360, Scalar(0, 0, 255), 1);
    }
}

如果我理解正确,lambda1 和 lambda2 应该是椭圆的半长轴和半短轴,mc - 他的中心和方向 - 旋转角度。相反,只有 mc 正确计算,其他参数是错误的(lambda 应该大得多),即使轮廓本身是椭圆。我该如何解决?

【问题讨论】:

    标签: c++ opencv image-processing ellipse


    【解决方案1】:

    能问一下这是干什么用的吗?我正在做类似的研究,试图制作一个基准标记。

    我研究的问题是:

    lambda1 = (m20 + m02)/2 + sqrt(4*m11*m11 - (m20 - m02)*(m20 - m02));

    实际上应该是:

    lambda1 = srqt((m20 + m02)/2 + sqrt(4*m11*m11 - (m20 - m02)*(m20 - m02)));

    希望这会有所帮助:)

    【讨论】:

    • 我想制作椭圆识别程序。您的回答有所帮助,但我选择了 Michele Fornaciari 和 Andrea Prati 的算法,因为这显然是不可靠的噪音原因。还是谢谢。
    • @JamellKhan,这在维度上是无稽之谈:sqrt(2nd-order moment)+sqrt(2nd-order-moment-squared)。
    猜你喜欢
    • 2018-03-11
    • 2019-07-08
    • 2019-05-07
    • 2021-09-01
    • 1970-01-01
    • 2014-07-27
    • 2020-05-22
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多