实现椭圆结构元素

Implement an Ellipse Structural Element

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

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

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

注意 当角度为 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;
}

一个讨厌的拼写错误潜入了你的不平等。第一个被加数必须是

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

注意 加号 而不是 减号