gpt4 book ai didi

c++ - 实现椭圆结构元素

转载 作者:行者123 更新时间:2023-11-28 05:07:17 25 4
gpt4 key购买 nike

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

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

  • 它应该以(width/2, height/2)

    为中心
  • 图像应该是二值的,所以椭圆对应的点的值应该是1,其他的应该是0

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

  • ellipse:半长轴参数为a,半短轴参数为b,这两个参数也代表了这些轴在图中的大小图片,所以“无论”宽度高度,椭圆的长轴都应该是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;
}

最佳答案

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

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

注意加号而不是减号

关于c++ - 实现椭圆结构元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com