轮廓处理函数详细
用多邊形曲線逼近 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這是一個(gè)單獨(dú)的逼近程序。 對(duì)同樣的逼近標(biāo)識(shí),函數(shù)?cvApproxChains?與?cvFindContours?的工作方式一模一樣。它返回發(fā)現(xiàn)的第一個(gè)輪廓的指針。其它的逼近模塊,可以用返回結(jié)構(gòu)中的?v_next?和?v_next?域來(lái)訪問(wèn)
StartReadChainPoints
初始化鏈讀取
void cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );?
????? 鏈的指針
reader
????? 鏈的讀取狀態(tài)
函數(shù)?cvStartReadChainPoints?初始化一個(gè)特殊的讀取器 (參考?Dynamic Data Structures?以獲得關(guān)于集合與序列的更多內(nèi)容).
ReadChainPoint
得到下一個(gè)鏈的點(diǎn)
CvPoint cvReadChainPoint( CvChainPtReader* reader );?
reader函數(shù)?cvReadChainPoint?返回當(dāng)前鏈的點(diǎn),并且更新讀取位置。
ApproxPoly
用指定精度逼近多邊形曲線
CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage, int method, double parameter, int parameter2=0 );?
src_seq函數(shù)?cvApproxPoly?逼近一個(gè)或多個(gè)曲線,并返回逼近結(jié)果。對(duì)多個(gè)曲線的逼近,生成的樹將與輸入的具有同樣的結(jié)構(gòu)。(1:1 的對(duì)應(yīng)關(guān)系).
BoundingRect
計(jì)算點(diǎn)集的最外面(up-right)矩形邊界
CvRect cvBoundingRect( CvArr* points, int update=0 );?
points- update=0, contour ~ CvContour*: 不計(jì)算矩形邊界,但直接由輪廓頭的?rect?域得到。
- update=1, contour ~ CvContour*: 計(jì)算矩形邊界,而且將結(jié)果寫入到輪廓頭的?rect?域中 header.
- update=0, contour ~ CvSeq* or CvMat*: 計(jì)算并返回邊界矩形
- update=1, contour ~ CvSeq* or CvMat*: 產(chǎn)生運(yùn)行錯(cuò)誤 (runtime error is raised)
函數(shù)?cvBoundingRect?返回二維點(diǎn)集的最外面 (up-right)矩形邊界。
ContourArea
計(jì)算整個(gè)輪廓或部分輪廓的面積
double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );?
contour函數(shù)?cvContourArea?計(jì)算整個(gè)輪廓或部分輪廓的面積。 對(duì)后面的情況,面積表示輪廓部分和起始點(diǎn)連線構(gòu)成的封閉部分的面積。如下圖所示:
?
NOTE:?輪廓的方向影響面積的符號(hào)。因此函數(shù)也許會(huì)返回負(fù)的結(jié)果。應(yīng)用函數(shù)?fabs()?得到面積的絕對(duì)值。
ArcLength
計(jì)算輪廓周長(zhǎng)或曲線長(zhǎng)度
double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );?
curve- is_closed=0 - 假設(shè)曲線不閉合
- is_closed>0 - 假設(shè)曲線閉合
- is_closed<0 - 若曲線是序列,檢查 ((CvSeq*)curve)->flags 中的標(biāo)識(shí) CV_SEQ_FLAG_CLOSED 來(lái)確定曲線是否閉合。否則 (曲線由點(diǎn)集的數(shù)組 (CvMat*) 表示) 假設(shè)曲線不閉合。
函數(shù)?cvArcLength?通過(guò)依次計(jì)算序列點(diǎn)之間的線段長(zhǎng)度,并求和來(lái)得到曲線的長(zhǎng)度。
CreateContourTree
創(chuàng)建輪廓的繼承表示形式
CvContourTree* cvCreateContourTree( const CvSeq* contour, CvMemStorage* storage, double threshold );?
contour函數(shù)?cvCreateContourTree?為輸入輪廓?contour?? 創(chuàng)建一個(gè)二叉樹,并返回樹根的指針。如果參數(shù)?threshold?小于或等于 0 ,則函數(shù)創(chuàng)建一個(gè)完整的二叉樹。如果?threshold?? 大于 0 , 函數(shù)用?threshold?指定的精度創(chuàng)建二叉樹:如果基線的截?cái)鄥^(qū)域頂點(diǎn)小于threshold,該數(shù)就停止生長(zhǎng)并作為函數(shù)的最終結(jié)果返回。
ContourFromContourTree
由樹恢復(fù)輪廓
CvSeq* cvContourFromContourTree( const CvContourTree* tree, CvMemStorage* storage, CvTermCriteria criteria );?
tree函數(shù)?cvContourFromContourTree?從二叉樹恢復(fù)輪廓。參數(shù)?criteria?決定了重構(gòu)的精度和使用樹的數(shù)目及層次。所以它可建立逼近的輪廓。 函數(shù)返回重構(gòu)的輪廓。
MatchContourTrees
用樹的形式比較兩個(gè)輪廓
double cvMatchContourTrees( const CvContourTree* tree1, const CvContourTree* tree2, int method, double threshold );?
tree1函數(shù)?cvMatchContourTrees?計(jì)算兩個(gè)輪廓樹的匹配值。從樹根開(kāi)始通過(guò)逐層比較來(lái)計(jì)算相似度。如果某層的相似度小于??threshold, 則中斷比較過(guò)程,且返回當(dāng)前的差值。
計(jì)算幾何
MaxRect
對(duì)兩個(gè)給定矩形,尋找矩形邊界
CvRect cvMaxRect( const CvRect* rect1, const CvRect* rect2 );?
rect1函數(shù)?cvMaxRect?尋找包含兩個(gè)輸入矩形的具有最小面積的矩形邊界。
CvBox2D
旋轉(zhuǎn)的二維盒子
typedef struct CvBox2D{
???? CvPoint2D32f center;
?? ??CvSize2D32f?? size;
???? float angle;
} CvBox2D;
BoxPoints
尋找盒子的頂點(diǎn)
void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] );?
box函數(shù)?cvBoxPoints?計(jì)算輸入的二維盒子的定點(diǎn)。下面是函數(shù)代碼:
void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] ){
???? float a = (float)cos(box.angle)*0.5f;
???? float b = (float)sin(box.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;
???? pt[1].y = box.center.y - b*box.size.height - a*box.size.width;
???? pt[2].x = 2*box.center.x - pt[0].x;
???? pt[2].y = 2*box.center.y - pt[0].y;
???? pt[3].x = 2*box.center.x - pt[1].x;
???? pt[3].y = 2*box.center.y - pt[1].y;
}
FitEllipse
二維點(diǎn)集的橢圓擬合
CvBox2D cvFitEllipse2( const CvArr* points );?
points函數(shù)?cvFitEllipse?對(duì)給定的一組二維點(diǎn)集作橢圓的最佳擬合(最小二乘意義上的)。返回的結(jié)構(gòu)與?cvEllipse?中的意義類似,除了?size?表示橢圓軸的整個(gè)長(zhǎng)度,而不是一半長(zhǎng)度。
FitLine
2D 或 3D 點(diǎn)集的直線擬合
void?? cvFitLine( const CvArr* points, int dist_type, double param, double reps, double aeps, float* line );?
points函數(shù)?cvFitLine?通過(guò)求 sumiρ(ri) 的最小值方法,用 2D 或 3D 點(diǎn)集擬合直線,其中 ri?是第 i 個(gè)點(diǎn)到直線的距離, ρ(r) 是下面的距離函數(shù)之一:
dist_type=CV_DIST_L2 (L 2): ρ(r)=r 2/2 (最簡(jiǎn)單和最快的最小二乘法)dist_type=CV_DIST_L1 (L 1): ρ(r)=r
dist_type=CV_DIST_L12 (L 1-L 2): ρ(r)=2?[sqrt(1+r 2/2) - 1]
dist_type=CV_DIST_FAIR (Fair): ρ(r)=C 2?[r/C - log(1 + r/C)],??
C=1.3998
dist_type=CV_DIST_WELSCH (Welsch): ρ(r)=C 2/2?[1 - exp(-(r/C) 2)],?? C=2.9846
dist_type=CV_DIST_HUBER (Huber): ρ(r)= r 2/2,???
if r < C ?????? C?(r-C/2),???
otherwise;??? C=1.345
ConvexHull2
發(fā)現(xiàn)點(diǎn)集的凸外形
CvSeq* cvConvexHull2( const CvArr* input, void* hull_storage=NULL, int orientation=CV_CLOCKWISE, int return_points=0 );?
points函數(shù)?cvConvexHull2?使用 Sklansky 算法計(jì)算 2D 點(diǎn)集的凸外形。如果?hull_storage?是內(nèi)存存儲(chǔ)倉(cāng), 函數(shù)根據(jù)?return_points??的值,創(chuàng)建一個(gè)包含外形的點(diǎn)集或指向這些點(diǎn)的指針的序列。
例子. 由點(diǎn)集序列或數(shù)組創(chuàng)建凸外形????
(見(jiàn)上一篇文章:凸包的繪制)????????????
CheckContourConvexity
測(cè)試輪廓的凸性
int cvCheckContourConvexity( const CvArr* contour );?
contour函數(shù)?cvCheckContourConvexity?輸入的輪廓是否為凸的。必須是簡(jiǎn)單輪廓,比如沒(méi)有自交叉。
CvConvexityDefect
用來(lái)描述一個(gè)簡(jiǎn)單輪廓凸性缺陷的結(jié)構(gòu)體
typedef struct CvConvexityDefect{
???? CvPoint* start;
???? CvPoint* end;
???? CvPoint* depth_point;
???? float depth;
} CvConvexityDefect;
Picture. Convexity defects of hand contour.
ConvexityDefects
發(fā)現(xiàn)輪廓凸形缺陷
CvSeq* cvConvexityDefects( const CvArr* contour, const CvArr* convexhull, CvMemStorage* storage=NULL );?
contour函數(shù)?cvConvexityDefects?發(fā)現(xiàn)輸入輪廓的所有凸性缺陷,并且返回?CvConvexityDefect?結(jié)構(gòu)序列。
MinAreaRect2
對(duì)給定的 2D 點(diǎn)集,尋找最小面積的包圍矩形
CvBox2D?? cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );?
points函數(shù)?cvMinAreaRect2?通過(guò)建立凸外形并且旋轉(zhuǎn)外形以尋找給定 2D 點(diǎn)集的最小面積的包圍矩形.
Picture. Minimal-area bounding rectangle for contour
MinEnclosingCircle
對(duì)給定的 2D 點(diǎn)集,尋找最小面積的包圍圓形
int cvMinEnclosingCircle( const CvArr* points, CvPoint2D32f* center, float* radius );?
points函數(shù)?cvMinEnclosingCircle?對(duì)給定的 2D 點(diǎn)集迭代尋找最小面積的包圍圓形。如果產(chǎn)生的圓包含所有點(diǎn),返回非零。否則返回零(算法失敗)。
CalcPGH
計(jì)算輪廓的 pair-wise 幾何直方圖
void cvCalcPGH( const CvSeq* contour, CvHistogram* hist );?
contour函數(shù)?cvCalcPGH?計(jì)算輪廓的 2D pair-wise(Hunnish: 不知如何翻譯,只好保留) 幾何直方圖 (pair-wise geometrical histogram :PGH), 算法描述見(jiàn)?[Iivarinen97]. 算法考慮的每一對(duì)輪廓邊緣。計(jì)算每一對(duì)邊緣之間的夾角以及最大最小距離。具體做法是,輪流考慮每一個(gè)邊緣做為基準(zhǔn),函數(shù)循環(huán)遍歷所有邊緣。在考慮基準(zhǔn)邊緣和其它邊緣的時(shí)候, 選擇非基準(zhǔn)線上的點(diǎn)到基準(zhǔn)線上的最大和最小距離。邊緣之間的角度定義了直方圖的行,而在其中增加對(duì)應(yīng)計(jì)算出來(lái)的最大和最小距離的所有直方塊, (即直方圖是 [Iivarninen97] 定義中的轉(zhuǎn)置). 該直方圖用來(lái)做輪廓匹配。
轉(zhuǎn)載于:https://www.cnblogs.com/retrieval/archive/2013/04/26/3044309.html
總結(jié)
- 上一篇: sql按拼音排序
- 下一篇: 测试Live Writer 发表博客