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...