如何确定椭圆的旋转角度和opencv中点之间的填充区域,c++

how to determine the rotation angle of ellipse and fill area between points in opencv, c++

我有三个点,假设 C 是中心点,而 P1 和 P2 是另外两个点。 我计算了 C 和 P1 之间的角度,称为角度 1,c p2 称为角度 2。 这是我用来计算它的代码

angle1 = atan2(p1.y - c.y, p1.x - c.x);
angle2 = atan2(p2.y - c.y, p2.x - c.x);

之后我用这个把它们变成了度数。

if (angle1 >= 0)
        angle1 = angle1 * (180 / PI);
    else
        angle1 = (angle1 + 2 * PI) * (180 / PI);

    if(angle2 >= 0)
        angle2 = angle2 * (180 / PI);
    else
        angle2 = (angle2 + 2 * PI) * (180 / PI);

然后我使用这个 openCv 方法来计算绘制弧线,有时弧线在两点之间是完美的,而有时它会填满除我 post 在此处成像的两个点之外的所有圆圈。

radius = sqrt(pow(c.x - p1.x, 2.0) + pow(c.y - p1.y, 2.0));
ellipse(outPutMat, c, cv::Size(radius, radius), 0, angle1, angle2, Scalar(0, 0, 0), -1, 8, 0);

这是图片

红色点为点,黑色为椭圆填充色。 对于第一个图像 agngle1 = 42.1376 而 angle2 = 338.962 对于第二张图片 agngle1 = 152.447 而 angle2 = 223.363

第二张图片产生了正确的结果,但第一张是错误的。我只想填充点之间的区域。

经过简短检查 - OpenCV 函数似乎计算中角为 ma = (angle1 + angle2) / 2 并通过该点绘制圆弧。

(-45,45) 和 (45,-45) 都给出了相同的通过零的 90 度弧度,(315,45) 和 (45,315) 给出了相同的 270 度arc.

为了得到想要的结果,您没有将负角度映射到正值 ((angle1 + 2 * PI)),而是在第一种情况下使用 42-21 值。