Я собираюсь предположить, что вы используете C++, но ответ должен быть таким же, если вы используете C или Python.
Функция minAreaRect
, как представляется, дает углы от -90 до 0 градусов, не считая нуля, поэтому интервал [-90, 0).
Функция дает -90 градусов, если прямоугольник, который он выдает, не вращается, т. Е. Прямоугольник имеет две стороны ровно горизонтальную и две стороны точно вертикальные. Когда прямоугольник вращается по часовой стрелке, угол увеличивается (идет к нулю). Когда нуль достигнут, угол, заданный функцией, снова гаснет на -90 градусов.
Так что если у вас длинный прямоугольник от minAreaRect
, и он лежит ровно, minAreaRect
будет называть угол -90 градусов. Если вы поворачиваете изображение до тех пор, пока прямоугольник, заданный minAreaRect
, не станет абсолютно вертикальным, тогда угол снова скажет -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;
}
Это позволяет легко увидеть, как угол, и форма, из нарисованных вручную прямоугольника сравнивается с minAreaRect
интерпретации тот же прямоугольник.
Чувак вы серьезный драгоценный камень. Спасибо :) – 2013-04-16 17:20:47
Нет проблем :) Документация OpenCV, похоже, пропустила множество важных деталей. –
Еще один вопрос: как я могу получить преобразование 0-360 градусов из rotatedrect, если оно дает только ангелы между -90, -1?И да, opencv, возможно, лучше документирует, когда вы копаете код или их образцы. – 2013-04-16 19:02:47