OpenCV中minAreaRect()最小外接矩形 cvBoxPoints()计算矩形顶点 RotatedRect和CvBox2D详解
生活随笔
收集整理的這篇文章主要介紹了
OpenCV中minAreaRect()最小外接矩形 cvBoxPoints()计算矩形顶点 RotatedRect和CvBox2D详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
minAreaRect()函數計算并返回指定點集的最小區域邊界斜矩形。
RotatedRect minAreaRect(InputArray points)
points:輸入信息,可以為包含點的容器(vector)或是Mat。RotatedRect :返回一個輪廓的外接矩形,是一個RotatedRect的類。包覆輸入信息的最小斜矩形,是一個Box2D結構rect:(最小外接矩形的中心(x,y),(寬度,高度),旋轉角度)。
但是要繪制這個矩形,我們需要矩形的4個頂點坐標box, 通過函數 cv2.cv.BoxPoints() 獲得,返回形式[ [x0,y0], [x1,y1], [x2,y2], [x3,y3] ]。得到的最小外接矩形的4個頂點順序、中心坐標、寬度、高度、旋轉角度(是度數形式,不是弧度數)的對應關系如下:注意:
- 旋轉角度θ是水平軸(x軸)逆時針旋轉,與碰到的矩形的第一條邊的夾角。并且這個邊的邊長是width,另一條邊邊長是height。也就是說,在這里,width與height不是按照長短來定義的。
- 在opencv中,坐標系原點在左上角,相對于x軸,逆時針旋轉角度為負,順時針旋轉角度為正。所以,θ∈(-90度,0]。
下面介紹一下矩形頂點的求解方法:
函數:cvBoxPoints(CvBox2D box, CvPoint2D32f pt[4])輸入:box 矩形數據,minAreaRect返回的RotatedRect 類就是一個Box2D結構的矩形。
???????????pt 返回的頂點數組。
對應的opencv源碼:
void RotatedRect::points(Point2f pt[]) const
{double _angle = angle*CV_PI/180.;float b = (float)cos(_angle)*0.5f;float a = (float)sin(_angle)*0.5f;pt[0].x = center.x - a*size.height - b*size.width;pt[0].y = center.y + b*size.height - a*size.width;pt[1].x = center.x + a*size.height - b*size.width;pt[1].y = center.y - b*size.height - a*size.width;pt[2].x = 2*center.x - pt[0].x;pt[2].y = 2*center.y - pt[0].y;pt[3].x = 2*center.x - pt[1].x;pt[3].y = 2*center.y - pt[1].y;
}
CV_IMPL void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] )
{if( !pt )CV_Error( CV_StsNullPtr, "NULL vertex array pointer" );cv::RotatedRect(box).points((cv::Point2f*)pt);
}
矩形頂點計算原理:
根據上述圖片,推導頂點公式如下:
與源碼中公式一致。
?
參考博客: [1](https://blog.csdn.net/u013925378/article/details/84563011) [2](http://www.pianshen.com/article/4885281921/)參考鏈接3
參考鏈接4
?
?
總結
以上是生活随笔為你收集整理的OpenCV中minAreaRect()最小外接矩形 cvBoxPoints()计算矩形顶点 RotatedRect和CvBox2D详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++动态链接库dll及静态链接库lib
- 下一篇: char和uchar区别