OpenCV中常用到的轮廓处理函数汇总
轉自:http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm
?
?
ApproxChains
用多邊形曲線逼近 Freeman 鏈
CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage,int method=CV_CHAIN_APPROX_SIMPLE,double parameter=0, int minimal_perimeter=0, int recursive=0 );
?
src_seq
涉及其它鏈的鏈指針
storage
存儲多邊形線段位置的緩存
method
逼近方法 (見函數 cvFindContours 的描述).
parameter
方法參數(現在不用).
minimal_perimeter
僅逼近周長大于 minimal_perimeter? 輪廓。其它的鏈從結果中除去。
recursive
如果非 0, 函數從 src_seq 中利用 h_next 和 v_next links 連接逼近所有可訪問的鏈。如果為 0, 則僅逼近單鏈。
這是一個單獨的逼近程序。 對同樣的逼近標識,函數 cvApproxChains 與 cvFindContours 的工作方式一模一樣。它返回發現的第一個輪廓的指針。其它的逼近模塊,可以用返回結構中的 v_next 和 v_next 域來訪問
StartReadChainPoints
初始化鏈讀取
void cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );
?
chain?
???? 鏈的指針
reader?
???? 鏈的讀取狀態
函數 cvStartReadChainPoints初始化一個特殊的讀取器 (參考 Dynamic Data Structures 以獲得關于集合與序列的更多內容).
ReadChainPoint
得到下一個鏈的點
CvPoint cvReadChainPoint( CvChainPtReader* reader );
?
reader
鏈的讀取狀態
函數 cvReadChainPoint 返回當前鏈的點,并且更新讀取位置。
ApproxPoly
用指定精度逼近多邊形曲線
CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage,int method, double parameter, int parameter2=0 );
?
src_seq
點集數組序列
header_size
逼近曲線的頭尺寸
storage
逼近輪廓的容器。如果為 NULL, 則使用輸入的序列
method
逼近方法。目前僅支持 CV_POLY_APPROX_DP , 對應 Douglas-Peucker 算法.
parameter
方法相關參數。對 CV_POLY_APPROX_DP 它是指定的逼近精度
parameter2
如果 src_seq 是序列,它表示要么逼近單個序列,要么在 src_seq 的同一個或低級層次上逼近所有序列 (參考 cvFindContours 中對輪廓繼承結構的描述). 如果 src_seq 是點集的數組 (CvMat*) , 參數指定曲線是閉合 (parameter2!=0) 還是非閉合 (parameter2=0).
函數 cvApproxPoly 逼近一個或多個曲線,并返回逼近結果。對多個曲線的逼近,生成的樹將與輸入的具有同樣的結構。(1:1 的對應關系).
BoundingRect
計算點集的最外面(up-right)矩形邊界
CvRect cvBoundingRect( CvArr* points, int update=0 );
?
points
二維點集,點的序列或向量 (CvMat)?
update
更新標識。下面是輪廓類型和標識的一些可能組合:
- update=0, contour ~ CvContour*: 不計算矩形邊界,但直接由輪廓頭的
rect域得到。 - update=1, contour ~ CvContour*: 計算矩形邊界,而且將結果寫入到輪廓頭的
rect域中 header. - update=0, contour ~ CvSeq* or CvMat*: 計算并返回邊界矩形
- update=1, contour ~ CvSeq* or CvMat*: 產生運行錯誤 (runtime error is raised)
函數 cvBoundingRect 返回二維點集的最外面 (up-right)矩形邊界。
ContourArea
計算整個輪廓或部分輪廓的面積
double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
?
contour
輪廓 (定點的序列或數組).
slice
感興趣輪廓部分的起始點,缺省是計算整個輪廓的面積。
函數 cvContourArea 計算整個輪廓或部分輪廓的面積。 對后面的情況,面積表示輪廓部分和起始點連線構成的封閉部分的面積。如下圖所示:
?
NOTE: 輪廓的方向影響面積的符號。因此函數也許會返回負的結果。應用函數 fabs() 得到面積的絕對值。
ArcLength
計算輪廓周長或曲線長度
double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );
?
curve
曲線點集序列或數組
slice
曲線的起始點,缺省是計算整個曲線的長度
is_closed
表示曲線是否閉合,有三種情況:
- is_closed=0 - 假設曲線不閉合
- is_closed>0 - 假設曲線閉合
- is_closed<0 - 若曲線是序列,檢查 ((CvSeq*)curve)->flags 中的標識 CV_SEQ_FLAG_CLOSED 來確定曲線是否閉合。否則 (曲線由點集的數組 (CvMat*) 表示) 假設曲線不閉合。
函數 cvArcLength 通過依次計算序列點之間的線段長度,并求和來得到曲線的長度。
CreateContourTree
創建輪廓的繼承表示形式
CvContourTree* cvCreateContourTree( const CvSeq* contour, CvMemStorage* storage, double threshold );
?
contour
輸入的輪廓
storage
輸出樹的容器
threshold
逼近精度
函數 cvCreateContourTree 為輸入輪廓 contour? 創建一個二叉樹,并返回樹根的指針。如果參數 threshold 小于或等于 0 ,則函數創建一個完整的二叉樹。如果 threshold? 大于 0 , 函數用 threshold 指定的精度創建二叉樹:如果基線的截斷區域頂點小于threshold,該數就停止生長并作為函數的最終結果返回。
ContourFromContourTree
由樹恢復輪廓
CvSeq* cvContourFromContourTree( const CvContourTree* tree, CvMemStorage* storage,CvTermCriteria criteria );
?
tree
輪廓樹
storage
重構的輪廓容器
criteria
停止重構的準則
函數 cvContourFromContourTree 從二叉樹恢復輪廓。參數 criteria 決定了重構的精度和使用樹的數目及層次。所以它可建立逼近的輪廓。 函數返回重構的輪廓。
MatchContourTrees
用樹的形式比較兩個輪廓
double cvMatchContourTrees( const CvContourTree* tree1, const CvContourTree* tree2,int method, double threshold );
?
tree1
第一個輪廓樹
tree2
第二個輪廓樹
method
相似度。僅支持 CV_CONTOUR_TREES_MATCH_I1 。
threshold
相似度閾值
函數 cvMatchContourTrees 計算兩個輪廓樹的匹配值。從樹根開始通過逐層比較來計算相似度。如果某層的相似度小于? threshold, 則中斷比較過程,且返回當前的差值。?
總結
以上是生活随笔為你收集整理的OpenCV中常用到的轮廓处理函数汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像轮廓的提取和绘制
- 下一篇: OpenCV查找轮廓