cvDilate 原始碼分析 1

2021-05-10 04:18:19 字數 3813 閱讀 9122

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