在cv.h檔案中對cvdilate的定義如下
cvapi(void) cvdilate( const cvarr* src, cvarr* dst,
iplconvkernel* element cv_default(null),
int iterations cv_default(1) );
iplconvkernel* 指向的是乙個結構元素塊;
在cxtypes.h中對 iplconvkernel 有如下定義
typedef struct _iplconvkernel
iplconvkernel;
element 如果為null 則使用 3x3 矩形元素進行膨脹。
element 不為null,可通過函式cvcreatestructuringelementex建立
在cv.h中
/* creates structuring element used for morphological operations */
cvapi(iplconvkernel*) cvcreatestructuringelementex(
int cols, int rows, int anchor_x, int anchor_y,
int shape, int* values cv_default(null) );
在cvmorph.cpp中
cv_impl iplconvkernel *
cvcreatestructuringelementex( int cols, int rows,
int anchorx, int anchory,
int shape, int *values )
else
__end__;
if( cvgeterrstatus() < 0 )
cvreleasestructuringelement( &element );
return element;}/*
名稱:init_binary_element
說明:如果輸入的element_shape為rect型別,則結構元素的所有元素被初始化為1;
如果輸入的element_shape為cross型別,列anchorx,行anchory的元素為1,其它為0;
如:anchorx = 0, anchory = 0; 則3 x 3的結構元素將初始化為
1, 1, 1
1, 0, 0
1, 0, 0
anchorx = 1, anchory = 1; 則3 x 3的結構元素將初始化為
0, 1, 0
1, 1, 1
0, 1, 0
如果輸入的element_shape為ellipse,則row * col矩形的內接ellipse區域都為1;
如:3 x 3的結構元素將初始化為
0, 1, 0
1, 1, 1
0, 1, 0
5 x 5的結構元素將初始化為
0, 0, 1, 0, 0
1, 1, 1, 1, 1
1, 1, 1, 1, 1
1, 1, 1, 1, 1
0, 0, 1, 0, 0
5 x 3的結構元素將初始化為
0, 1, 0
1, 1, 1
1, 1, 1
1, 1, 1
0, 1, 0 */
在cvmorph.cpp中
void cvmorphology::init_binary_element( cvmat* element, int element_shape, cvpoint anchor )
for( i = 0; i < rows; i++ )
}for( j = 0, jx = j1; j < cols; )
if( jx == j2 )
jx = cols, t = 0;
else
jx = j2, t = 1;}}
__end__;
}至此結構元素建立完了
cv_impl void
cvdilate( const void* src, void* dst, iplconvkernel* element, int iterations )
static void
icvmorphop( const void* srcarr, void* dstarr, iplconvkernel* element,
int iterations, int mop )
if( dstarr == srcarr )
dst = src;
else
if( dst != &dststub )
if( coi1 != 0 || coi2 != 0 )
cv_error( cv_badcoi, "" );
type = cv_mat_type( src->type );
size = cvgetmatsize( src );
inplace = src->data.ptr == dst->data.ptr;
if( iterations == 0 || (element && element->ncols == 1 && element->nrows == 1))
if( element )
else
if( el_shape == cv_shape_rect && iterations > 1 )
if( el_shape == cv_shape_rect && icveroderect_getbufsize_8u_c1r_p )
else
if( rect_getbufsize_func && rect_func )
else
cv_call( buffer = cvalloc( bufsize ));
}if( status >= 0 )
src_step = src->step ? src->step : cv_stub_step;
status = rect_func( src->data.ptr, src_step, dst->data.ptr,
dst_step, size, el_size, el_anchor, buffer );
}if( status >= 0 )
exit;}}
else if( el_shape == cv_shape_custom && icvmorphinitalloc_8u_c1r_p && icvmorphfree_p &&
src->data.ptr != dst->data.ptr )
src_ptr = src->data.ptr;
src_step = src->step ? src->step : cv_stub_step;
for( i = 0; i < iterations && status >= 0 && morphstate; i++ )
}if( status >= 0 )}}
if( el_shape != cv_shape_rect )
//進入init
cv_call( morphology.init( mop, src->cols, src->type,
el_shape, el, el_size, el_anchor ));
for( i = 0; i < iterations; i++ )
__end__;
if( !local_alloc )
cvfree( &buffer );
if( morphstate )
icvmorphfree_p( morphstate );
cvreleasemat( &temp );
}
leveldb原始碼分析1
leveldb是乙個key value型的儲存引擎,由google開發,並宣布在bsd許可下開放源 plain git clone plain cd leveldb make all 此時生成libleveldb.a庫檔案。拷貝leveldb的標頭檔案到 usr include下 plain cp ...
Leveldb原始碼分析 1
前言 看了一點oceanbase,沒有意志力繼續堅持下去了,暫時就此中斷,基本上算把master看完了,比較重要的update server和merge server 卻沒有細看。中間又陸續研究了hadoop的原始碼,主要是name node和寫入pipeline。主要的目的是想看看name nod...
Nutch 原始碼分析 1
org.apache.nutch.crawl.crawl類的主函式如下所示 應該知道,nutch查詢檔案系統是基於linux系統的機制的,所以提供啟動的命令與linux的shell命令很相似。public static void main string args throws exception c...