MinAreaRect角度-不确定返回的角度 [英] MinAreaRect angles - Unsure about the angle returned

查看:677
本文介绍了MinAreaRect角度-不确定返回的角度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

From the functions for MinAreaRect, does it return angles in the range of 0-360 degrees? I am unsure as i have an object that is oriented at 90 degrees or so but I keep getting either -1 or -15 degrees. Could this be an openCV error?

非常感谢任何指导.

谢谢

推荐答案

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

I'm going to assume you're using C++, but the answer should be the same if you're using C or Python.

函数minAreaRect似乎提供的角度范围为-90到0度(不包括零),因此间隔为[-90,0).

The function minAreaRect seems to give angles ranging from -90 to 0 degrees, not including zero, so an interval of [-90, 0).

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

The function gives -90 degrees if the rectangle it outputs isn't rotated, i.e. the rectangle has two sides exactly horizontal and two sides exactly vertical. As the rectangle rotates clockwise, the angle increases (goes towards zero). When zero is reached, the angle given by the function ticks back over to -90 degrees again.

因此,如果从minAreaRect起有一个长矩形,并且该矩形平放,则minAreaRect将称为-90度角.如果旋转图像直到minAreaRect给出的矩形完全垂直,则该角度将再次为-90度.

So if you have a long rectangle from minAreaRect, and it's lying down flat, minAreaRect will call the angle -90 degrees. If you rotate the image until the rectangle given by minAreaRect is perfectly upright, then the angle will say -90 degrees again.

我实际上什么都不知道(我从OpenCV项目中拖延了一下,以了解它是如何工作的:/).无论如何,这是一个OpenCV程序,用于演示minAreaRect(如果我还没有足够清楚地说明它的话):

I didn't actually know any of this (I procrastinated from my OpenCV project to find out how it works :/). Anyway, here's an OpenCV program that demonstrates minAreaRect if I haven't explained it clear enough already:

#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;
}

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

This lets you easily see how the angle, and shape, of a manually drawn rectangle compares to the minAreaRect interpretation of the same rectangle.

这篇关于MinAreaRect角度-不确定返回的角度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆