最近很忙,忙的連寫日記的功夫都沒有了。
有個專案的需求是需要把多個圓環的區域合併。得到包絡線和內部空洞的線。
查了查google。類似的實現比較少見。簡單的說說我的實現方法。
基本想法就是通過判斷一段圓弧和圓環組的關係,來判斷這段圓弧是否是屬於合併後的包絡線的一部分
如圖,左邊的圓盒右邊的圓相交。則這兩個圓就被分成了兩段。
對外包絡線,如上圖。將所有圓環的外圓(粗線)相交。把每個圓都切成一段段的圓弧,如左邊的黑色圓,則切成了黑色段和黑色+紅色的兩段。對每一段,我們測試這一段弧是否在其它圓環的大圓內部,如果這段圓弧不在其它的環的大圓內部(不包括內部小圓),則這段圓弧屬於外包絡線的一部分。否則不是。
內部透空的小圓的合併稍微麻煩一些。因為透空的部分,不光是小圓的弧,還會有大圓弧的參與。
考察小圓的圓弧,同樣的,我們將小圓 和其它圓環的求交點,把小圓切成一段段的弧線(注意小圓和其它環求交的時候,就要跟這個環的大小圓都交一遍,而不光是小圓和小圓了)。如果這一段弧線不在這組圓環內(指的是環的內部,而不是大圓的內部),則表示這段弧是屬於內包絡線的一部分。
考察大圓的弧,大圓產生內包絡線的原因主要是大圓會抵消一部分小圓的透空作用。所以同樣的我們將大圓 和其它圓環的求交點,把小圓切成一段段的弧線--跟外包絡不同,這次求交的時候,該大圓要和其它圓環的大小圓都求交,而不光是大圓對大圓。 對每一段圓弧,如果弧線不在環的內部,而且該段弧應該還需要位於某個環的小圓內部(看圖就明白為什麼了)。則該大圓弧也是內包絡的一部分。
這裡求圓弧在環的內部還是在大小圓內,有乙個偷懶的方法。因為我們已經保證這段圓弧除了兩個端點以外不和其它任何弧相交,所以只要用這段弧的中點來代替弧來作判斷就好了。使得複雜性大大降低了。
以上是效果圖,三個環合併成乙個區域。
以下是主要**
class cringgroup
}void tosplinedrawer(csplinedraw& drawer)
for(int i = 0 ; i < m_vrings.size() ; i ++)
}void toinnerline(std::vector& vout)
_ring.toarcs(vcutpoints , false , varcs);
//內圓的弧,必須在所有的外圓的外部。
for(int iarc = 0 ; iarc < varcs.size() ; iarc ++)}//
if(binring == false)
}//內圓切完了。來切外圓套在其它內圓中的部分。
vcutpoints.clear();
varcs.clear();
for(int j = 0 ; j < m_vrings.size() ; j ++)
_ring.toarcs(vcutpoints , true , varcs);
//內圓的弧,必須在所有的外圓的外部。
for(int iarc = 0 ; iarc < varcs.size() ; iarc ++)
if( true == _ring2.isinsmallring( _arc) )}//
if(binring == false && binsmallring == true)}}
return ;
}void tooutline(std::vector& vout)}//
if(binring == false)}}
return ;
}public:
std::vectorm_vrings;
};
多個圓環組成的區域的合併
最近很忙,忙的連寫日記的功夫都沒有了。有個專案的需求是需要把多個圓環的區域合併。得到包絡線和內部空洞的線。查了查google。類似的實現比較少見。簡單的說說我的實現方法。基本想法就是通過判斷一段圓弧和圓環組的關係,來判斷這段圓弧是否是屬於合併後的包絡線的一部分 如圖,左邊的圓盒右邊的圓相交。則這兩個...
把多個圓環的區域合併 得到包絡線和內部空洞的線
有個專案的需求是需要把多個圓環的區域合併。得到包絡線和內部空洞的線。查了查google。類似的實現比較少見。簡單的說說我的實現方法。基本想法就是通過判斷一段圓弧和圓環組的關係,來判斷這段圓弧是否是屬於合併後的包絡線的一部分 如圖,左邊的圓盒右邊的圓相交。則這兩個圓就被分成了兩段。對外包絡線,如上圖。...
目標檢測時的區域合併
在目標檢測過程中,可能會遇到這樣的情況 乙個目標被標記為多個區域。如果乙個目標被標記為多個區域,後續的跟蹤很容易出現跟錯 跟丟,這個情形在自動檢測場和是很避諱的。以下提供乙個避免的方法 通過一些條件判斷,可以將本為同一目標的區域辨識,前文應該講過判斷方法。中心距離在閾值範圍內 兩個區域存在交集 包含...