从MinAreaRect的函数中,它是否返回0-360度范围内的 Angular ?
我不确定我有一个90度左右的物体,但是我一直保持-1或-15度。难道这是一个openCV错误?

任何指导表示赞赏。

谢谢

最佳答案

我假设您使用的是C++,但是如果您使用的是C或Python,答案应该是相同的。

函数minAreaRect似乎给出的 Angular 范围为-90到0度(不包括零),因此间隔为[-90,0)。

如果其输出的矩形不旋转,则该函数给出-90度,即矩形的两边正好水平,而两边正好垂直。随着矩形顺时针旋转, Angular 会增加(趋近于零)。达到零时,函数给定的 Angular 将再次滴答回到-90度。

因此,如果您有一个来自minAreaRect的长矩形,并且该矩形平放,则minAreaRect将称为-90度角。如果旋转图像直到minAreaRect给定的矩形完全垂直,则该 Angular 将再次为-90度。

我实际上一无所知(我从OpenCV项目中拖延了一下,以了解其工作原理:/)。无论如何,这是一个OpenCV程序,如果我还没有足够清楚地说明它,它将演示minAreaRect:

#include <stdio.h>

#include <opencv\cv.h>
#include <opencv\highgui.h>

using namespace cv;

int main() {
    float angle = 0;
    Mat image(200, 400, CV_8UC3, Scalar(0));
    RotatedRect originalRect;
    Point2f vertices[4];
    vector<Point2f> vertVect;
    RotatedRect calculatedRect;

    while (waitKey(5000) != 27) {
        // Create a rectangle, rotating it by 10 degrees more each time.
        originalRect = RotatedRect(Point2f(100,100), Size2f(100,50), angle);

        // Convert the rectangle to a vector of points for minAreaRect to use.
        // Also move the points to the right, so that the two rectangles aren't
        // in the same place.
        originalRect.points(vertices);
        for (int i = 0; i < 4; i++) {
            vertVect.push_back(vertices[i] + Point2f(200, 0));
        }

        // Get minAreaRect to find a rectangle that encloses the points. This
        // should have the exact same orientation as our original rectangle.
        calculatedRect = minAreaRect(vertVect);

        // Draw the original rectangle, and the one given by minAreaRect.
        for (int i = 0; i < 4; i++) {
            line(image, vertices[i], vertices[(i+1)%4], Scalar(0, 255, 0));
            line(image, vertVect[i], vertVect[(i+1)%4], Scalar(255, 0, 0));
        }
        imshow("rectangles", image);

        // Print the angle values.
        printf("---\n");
        printf("Original angle:             %7.2f\n", angle);
        printf("Angle given by minAreaRect: %7.2f\n", calculatedRect.angle);
        printf("---\n");

        // Reset everything for the next frame.
        image = Mat(200, 400, CV_8UC3, Scalar(0));
        vertVect.clear();
        angle+=10;
    }

    return 0;
}

这使您可以轻松地看到手动绘制的矩形的 Angular 和形状与同一个矩形的minAreaRect解释相比。

10-06 11:14