从MinAreaRect的功能来看,它是否会返回0-360度范围内的角度?我不确定,因为我有一个朝向90度左右的物体,但我一直得到-1或-15度.这可能是openCV错误吗?
任何指导非常感谢.
谢谢
Ada*_*win 39
我假设您正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
这使您可以轻松查看手动绘制的矩形的角度和形状minAreaRect与同一矩形的解释之间的比较.
Seb*_*itz 20
改进@Adam Goodwin的答案我想添加一些改变行为的小代码:
我希望在长边和垂直之间有一个角度(对我而言,这是考虑旋转矩形的最自然的方式):

如果您需要相同的,只需使用此代码:
void printAngle(RotatedRect calculatedRect){
if(calculatedRect.size.width < calculatedRect.size.height){
printf("Angle along longer side: %7.2f\n", calculatedRect.angle+180);
}else{
printf("Angle along longer side: %7.2f\n", calculatedRect.angle+90);
}
}
Run Code Online (Sandbox Code Playgroud)
要查看它的实际效果,只需将其插入Adam Goodwins代码:
printf("Angle given by minAreaRect: %7.2f\n", calculatedRect.angle);
printAngle(calculatedRect);
printf("---\n");
Run Code Online (Sandbox Code Playgroud)
小智 5
经过实验发现,如果长边在底部点的左侧,则角度值在长边与Y+轴之间,但如果长边在底部点的右侧,则角度值在长边与Y+轴之间侧和 X+ 轴。所以我使用这样的代码(java):
rRect = Imgproc.minAreaRect(mop2f);
if(rRect.size.width<rRect.size.height){
angle = 90 -rRect.angle;
}else{
angle = -rRect.angle;
}
Run Code Online (Sandbox Code Playgroud)
角度从 0 到 180。
经过大量实验,我发现矩形方向与输出角度之间的关系minAreaRect()。可以总结为下图
下面的描述假设我们有一个长宽高不相等的矩形,即它不是正方形。
如果矩形垂直放置(宽度 < 高度),则检测到的角度为 -90。如果矩形水平放置,则检测到的角度也是-90度。
如果矩形的顶部位于第一象限,则检测到的角度随着矩形从水平位置旋转到垂直位置而减小,直到检测到的角度变为-90度。在第一象限中,检测到的矩形的宽度大于其高度。
如果检测到的矩形的顶部位于第二象限,则角度随着矩形从垂直位置旋转到水平位置而减小。但第二象限和第一象限之间存在差异。如果矩形接近垂直位置但尚未处于垂直位置,则其角度接近 0。如果矩形接近水平位置但尚未处于水平位置,则其角度接近 -90 度。
这里的这篇文章也很好地解释了这一点。
| 归档时间: |
|
| 查看次数: |
27868 次 |
| 最近记录: |