1. 程式人生 > >opencv中最小外接矩形2 的演算法

opencv中最小外接矩形2 的演算法


之前用到opencv最小外接矩形去表示一個類橢圓形的高度,特此記錄備查。

對給定的 2D 點集,尋找最小面積的包圍矩形,使用函式:

CvBox2DcvMinAreaRect2(constCvArr*points,CvMemStorage*storage=NULL);

   points
   點序列或點集陣列    storage    可選的臨時儲存倉   函式 cvMinAreaRect2 通過建立凸外形並且旋轉外形以尋找給定 2D 點集的最小面積的包圍矩形。

其中返回的2D盒子定義如下:

1 typedefstructCvBox2D
2 {
3 CvPoint2D32fcenter;/*盒子的中心
*/
4 CvSize2D32fsize;/*盒子的長和寬*/
5 floatangle;/*水平軸與第一個邊的夾角,用弧度表示*/
6 }CvBox2D;
注意夾角 angle 是水平軸逆時針旋轉,與碰到的第一個邊(不管是高還是寬)的夾角。如下圖

                                  2010-11-25 9-05-42

  可用函式 cvBoxPoints(box[count], point); 尋找盒子的頂點

voidcvBoxPoints(CvBox2Dbox,CvPoint2D32fpt[4])
{
doubleangle=box.angle*CV_PI/180.
float
a=(float)cos(angle)*0.5f;
floatb=(float)sin(angle)*0.5f;

pt[0].x=box.center.x-a*box.size.height-b*box.size.width;
pt[0].y=box.center.y+b*box.size.height-a*box.size.width;
pt[1].x=box.center.x+a*box.size.height-b*box.size.width;
10 pt[1].y=box.center.y-b*box.size.height-a*box.size.width;
11
pt[2].x=2*box.center.x-pt[0].x;
12 pt[2].y=2*box.center.y-pt[0].y;
13 pt[3].x=2*box.center.x-pt[1].x;
14 pt[3].y=2*box.center.y-pt[1].y;
15 }
簡單證明此函式的計算公式:    計算x,由圖可得到三個方程式: pt[1].x-pt[0].x=width*sin(angle)
                             pt[2].x-pt[1].x=height*cos(angle)
                             pt[2].x-pt[0].x=2(box.center.x-pt[0].x)    聯立方程可解得函式裡的計算式,算 y 略。

寫了個函式繪製CvBox2D

voidDrawBox(CvBox2Dbox,IplImage*img)
{
CvPoint2D32fpoint[4];
inti;
for(i=0;i<4;i++)
{
point[i].x=0;
point[i].y=0;
}
10 cvBoxPoints(box,point);//計算二維盒子頂點
11 CvPointpt[4];
12 for(i=0;i<4;i++)
13 {
14 pt[i].x=(int)point[i].x;
15 pt[i].y=(int)point[i].y;
16 }
17 cvLine(img,pt[0],pt[1],CV_RGB(255,0,0),2,8,0);
18 cvLine(img,pt[1],pt[2],CV_RGB(255,0,0),2,8,0);
19 cvLine(img,pt[2],pt[3],CV_RGB(255,0,0),2,8,0);
20 cvLine(img,pt[3],pt[0],CV_RGB(255,0,0),2,8,0);
21 }

相關推薦

opencv矩形2演算法

之前用到opencv最小外接矩形去表示一個類橢圓形的高度,特此記錄備查。 對給定的 2D 點集,尋找最小面積的包圍矩形,使用函式: CvBox2DcvMinAreaRect2(constCvArr*points,CvMemStorage*storage=NULL);

Opencv獲取矩形——minAreaRect

//!computes the minimal rotated rectangle for a set of points RotatedRect minAreaRect(InputArray points);//計算一些列點的最小外接矩形,帶角度資訊 C+

Opencv】繪製矩形外接圓

Opencv繪製最小外接矩形、最小外接圓 Opencv中求點集的最小外結矩使用方法minAreaRect,求點集的最小外接圓使用方法minEnclosingCircle。 minAreaRect方法原型: RotatedRect minAreaRect( Input

OpenCV找出矩形

慣例先放結果吧 測試圖片盜取自:  地址  (2333) 其實就一行關鍵的程式碼: RotatedRect rect = minAreaRect(contours[i]);下面就是簡單粗暴的程

BZOJ 1185: [HNOI2007]矩形覆蓋-旋轉卡殼法求點集矩形(面積)並輸出四個頂點坐標-備忘板子

article ref https color 旋轉 blank spa def abs 來源:旋轉卡殼法求點集最小外接矩形(面積)並輸出四個頂點坐標 BZOJ又崩了,直接貼一下人家的代碼。 代碼: 1 #include"stdio.h"

opencv矩陣

求最小外接矩陣的基本原理: 獲取點簇最開始的minx,maxx,miny,maxy確定最初的外接矩形,求外接矩形的面積,然後對點簇進行旋轉,按照下面公式即可: 旋轉之後,求出新的minx,maxx,miny,maxy,計算此時的面積,直到面積達到最小,對應的即為最小外接矩形。 關於

(五)建築物多邊形化簡系列——矩形的獲取

最小外接矩形問題是在給出一個多邊形(或一群點),求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。   演算法的主要思想是: (1)先實現多邊形的簡單外接矩形的演算法。簡單外接矩形是指邊平

C/C++ 影象處理(16)------影象輪廓の矩形

有時做影象處理,會遇到影象中大部分資訊是冗餘的情況,以下圖為例: 假設圖中黑色部分才是我們需要研究的物件,則外圍的一堆白色是我們希望去掉的,這個時候用最小外接矩形來框住黑色部分,進而擷取該部分的資

矩形(ROI)

//---------------------------------【標頭檔案、名稱空間包含部分】---------------------------- // 描述:包含程式所使用的標頭檔案和名稱空間 //-------------------------------

點集演算法

作者:馮浩 時間: 2007.10.11 文件型別/出處:NOI專刊 題目簡述: 給出一個平面點集S,求一個面積最小的矩形使其包含S所有的點。 預備知識: 在求解這道題之前我們先要了解一些關於凸包的知識。 什麼是凸包?簡單地說,對於一個

連通域的多邊形

在MATLAB中,使用roipoly來選擇一個感興趣區域(ROI),該函式將生成一個多邊形的ROI。函式的用法為:1、B=roipoly(f,c,r);其中f為要處理的影象,c和r分別是ROI的頂點對應的列座標和行座標(按順序排列)。定點座標的原點在左上角。B為一幅二值影象,

Opencv 輪廓 逼近多邊形曲線 正矩形 矩形

環境 win7 + vs2015 + Opencv2.4.13 對影象輪廓點進行多邊形擬合 void approxPolyDP( InputArray curve,                                 OutputArray appro

opencv 顯示面積的矩形,並求該矩形的長和寬以及四個角的位置

#include "cv.h" #include "highgui.h" #include <stdio.h> #include <math.h> int main(int argc,char** argv) {  IplImage *src,*gr

AreEngine 求面積的矩形,非IEnvelope,表達不清楚了

1,總是會得到一些奇奇怪怪的要求,求一個面對象的外接最小面積的矩形,和ArcToolBox中的Mininum Bounding Geometry功能下的RECTANGLE_BY_AREA想似。具體看下圖:   區別如上圖所示:IEnvelope 得到的是下圖所示,需要的是第一種 (只是記錄一

hdu 5251 矩形面積 (旋轉卡殼求面積矩形

矩形面積 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 417    Accepted Submission

26、【opencv入門】輪廓查找與繪制(4)——正矩形

waitkey font 定義 truct 形狀 esp 圖片 namespace open 一、簡介 1、使用特定形狀的輪廓包圍   在實際應用中, 經常會有將檢測到的輪廓用多邊形表示出來的需求, 提取包圍輪廓的多邊形也方便我們做進一步分析, 輪廓包圍主要有一下幾種: 輪

給定陣列a[0:n-1]試設計一個演算法,在壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]元素的大值和值;教材2-15

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找

OpenCV minMaxLoc找影象大值及它們的位置

void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray()) src:輸入影象。 minVal:最

在一個列表儲存以下元素:apple,grape,banana,pear 3.1 返回集合大的和的元素 3.2 將集合進行排序,並將排序後的結果列印在控制檯上 [必做題]

比較類 public class name implements Comparator<f>{ @Override public int compare(f o1, f o2) { return o2.getName().compareTo(o1.get

openCV實現影象的輪廓檢測以及矩形

前兩篇博文分別介紹了影象的邊緣檢測和輪廓檢測,本文接著介紹影象的輪廓檢測和輪廓外接矩形: 一、程式碼部分: // extract_contours.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include&