groupRectangles函式詳解

2021-06-25 08:19:35 字數 1968 閱讀 5114

void grouprectangles(vector& rectlist, int groupthreshold, double eps, vector* weights, vector* levelweights)

1. 呼叫partition

,將所有的矩形框初步分為幾類,其中出參labels為每個矩形框對應的類別編號,入參eps為判斷兩個矩形框是否屬於同一類的控制引數。如果兩個矩形框的四個相應頂點的差值的絕對值都在deta範圍內,則認為屬於同一類,否則是不同類。

其中deta = eps*(std::min(r1.width, r2.width) + std::min(r1.height, r2.height))*0.5;

返回值nclasses

為類別數目。

int nclasses = partition(rectlist, labels, similarrects(eps));

2. 計算每一類別的平均矩形框位置,即每乙個類別最終對應乙個矩形框。

3. 將2

中得到的所有矩形框再次過濾

(1)將每一類別中矩形框個數較少的類別過濾掉。每一類中的矩形框個數是由可以由partition分類得出的,即可以得出每一類有多少個矩形框。而步驟2僅僅是將這些個矩形框求其位置平均值。過濾的個數閾值為入參groupthreshold

,只有當某乙個類別中的矩形框個數大於此閾值,才保留該類別。

(2)將嵌在大矩形框內部的小矩形框過濾掉。最後剩下的矩形框即為聚類的結果。

下面介紹一下partition

函式template

_tp, class

_eqpredicate> int

partition( const

vector

<_tp>& _vec, vector

& labels,

_eqpredicate

predicate=_eqpredicate())

// the main o(n^2) pass: merge connected components

//每乙個節點都和其他所有的節點比較,看是否是屬於同一類

//屬於同一類的判斷:predicate(vec[i], vec[j]), predicate為傳入的similarrects

//similarrects判斷兩個矩形框的四個相應頂點的差值的絕對值都在deta範圍內, //

則認為屬於同一類,否則是不同類

//兩層for迴圈和後面的壓縮策略保證了最終形成以很多類,每一類以根節點為中心,、、//其餘該類的節點的父座標都指向根節點

for( i = 0; i

< n; i++ )

assert( nodes[root][parent] < 0 );//

根節點的parent必須小於0

intk = j, parent;

// compress the path from node2 to root

//下一級節點通過它的根節點連線到上一級根節點時,直接將下一級節點和根節點都連線到上級的根節點,如果是單獨的節點連線到某個根節點,迴圈不改變任何值

while( (parent = nodes[k][parent]) >= 0 )

// compress the path from node to root

//同一級節點通過它的根節點連線到同級的根節點時,直接將該節點和根節點都連線到同級的根節點,如果是單獨的節點連線到某個根節點,迴圈不改變任何值

k = i;

while( (parent = nodes[k][parent]) >= 0 )

} }

} // final o(n) pass: enumerate classes

labels.resize(n);

intnclasses = 0;//

總分類數

for( i = 0; i

< n; i++ )

return

nclasses; }

ngx process options函式詳解

ngx process options是初始化init cycle中的一些如 conf file,prefix,conf prefix等字段的功能,其方法的定義在src core nginx.c中,以下為詳細 主要功能是將ngx prefix,配置檔案的位置資訊,以及命令列引數的資訊初始化到cycl...

linux clock gettime函式詳解

注意 1.精確級別,納秒級別 原型long sys clock gettime clockid t which clock,struct timespec tp which clock引數解釋 clock realtime 系統實時時間,隨系統實時時間改變而改變,即從utc1970 1 1 0 0 ...

遞迴函式(詳例)

從函式棧的角度的運用 簡單的列印運用 includevoid function int n int main void function int n return 非空鍊錶的遞迴找最大值 lim findmax lim headptr 為了更好的理解遞迴的執行過程 在呼叫自生到最後時,if head...