【问题标题】:Implement an Ellipse Structural Element实现椭圆结构元素
【发布时间】:2017-06-06 14:13:26
【问题描述】:

我想使用 OpenCV 实现以下内容(我将在帖子底部发布我的尝试)。我知道 OpenCV 有这样的功能,但我想尝试自己编写。

在宽度width和高度height的图像(Mat)(坐标系在左上角,因为它是图像)中,我想显示一个填充椭圆以下属性:

  • 应该以(width/2, height/2)为中心

  • 图像应该是二进制的,所以椭圆对应的点应该是1,其他应该是0

  • 椭圆应该围绕原点旋转angle弧度(或度数,这无关紧要,我可以转换)

  • 椭圆:半长轴参数为a,半短轴参数为b,这两个参数也代表了图中这些轴的大小,所以“不管”@987654328 @ 和height,椭圆应该有一个大小为2*a 的长轴和一个大小为2*b 的短轴

好的,所以我找到了一个与此类似的方程式 (https://math.stackexchange.com/a/434482/403961) 用于我的目的。我的代码如下..它似乎在旋转方面做得很好,但遗憾的是,根据旋转角度,SIZE(长轴,不确定小轴)明显增加/减少,这是不正常的,因为我希望它具有相同的大小,与旋转角度无关。

注意似乎在角度为 45 或 -45 度时达到最大尺寸,在 -90、0、90 等角度时达到最小尺寸。

代码:

inline double sqr(double x)
{
    return x * x;
}

Mat ellipticalElement(double a, double b, double angle, int width, int height)
{
    // just to make sure I don't use some bad values for my parameters
    assert(2 * a < width);
    assert(2 * b < height);

    Mat element = Mat::zeros(height, width, CV_8UC1);

    Point center(width / 2, height / 2);
    for(int x = 0 ; x < width ; x++)
        for(int y = 0 ; y < height ; y++)
        {
            if (sqr((x - center.x) * cos(angle) - (y - center.y) * sin(angle)) / sqr(a) + sqr((x - center.x) * sin(angle) - (y - center.y) * cos(angle)) / sqr(b) <= 1)
                element.at<uchar>(y, x) = 1;
        }

    return element;
}

【问题讨论】:

    标签: c++ opencv image-processing rotation ellipse


    【解决方案1】:

    一个讨厌的错字潜入你的不平等。第一个和必须是

    sqr((x - center.x) * cos(angle) + (y - center.y) * sin(angle)) / sqr(a)
    

    注意加号,而不是减号

    【讨论】:

    • Yaaay,现在似乎工作得很好。非常感谢!我实际上记得我可能认为我觉得很奇怪那里没有加号(现在我想得更好了,二维旋转矩阵在其中一个单元格中只有一个减号),但是在我阅读公式的书中,它是用减号写的(我想这是一个错字)。我提到的 Stackoverflow 帖子中似乎写得很好 :) 再次感谢您的帮助!
    • 一定是错字。例如,如果旋转角度等于 π/4,则 (0;0) 点将始终使不等式的整个左侧变小(在 h == k 的情况下甚至为零)并始终满足条件。这就是为什么当给定 π/4 时程序会产生类似矩形的东西。很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    相关资源
    最近更新 更多