【发布时间】: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