MCPcopy Create free account
hub / github.com/creatale/node-dv / icvInitEMD

Function icvInitEMD

deps/opencv/modules/imgproc/src/emd.cpp:323–559  ·  view source on GitHub ↗

\ * initialize structure, allocate buffers and generate initial golution * \************************************************************************************/

Source from the content-addressed store, hash-verified

321* initialize structure, allocate buffers and generate initial golution *
322\************************************************************************************/
323static int icvInitEMD( const float* signature1, int size1,
324 const float* signature2, int size2,
325 int dims, CvDistanceFunction dist_func, void* user_param,
326 const float* cost, int cost_step,
327 CvEMDState* state, float* lower_bound,
328 cv::AutoBuffer<char>& _buffer )
329{
330 float s_sum = 0, d_sum = 0, diff;
331 int i, j;
332 int ssize = 0, dsize = 0;
333 int equal_sums = 1;
334 int buffer_size;
335 float max_cost = 0;
336 char *buffer, *buffer_end;
337
338 memset( state, 0, sizeof( *state ));
339 assert( cost_step % sizeof(float) == 0 );
340 cost_step /= sizeof(float);
341
342 /* calculate buffer size */
343 buffer_size = (size1+1) * (size2+1) * (sizeof( float ) + /* cost */
344 sizeof( char ) + /* is_x */
345 sizeof( float )) + /* delta matrix */
346 (size1 + size2 + 2) * (sizeof( CvNode2D ) + /* _x */
347 sizeof( CvNode2D * ) + /* cols_x & rows_x */
348 sizeof( CvNode1D ) + /* u & v */
349 sizeof( float ) + /* s & d */
350 sizeof( int ) + sizeof(CvNode2D*)) + /* idx1 & idx2 */
351 (size1+1) * (sizeof( float * ) + sizeof( char * ) + /* rows pointers for */
352 sizeof( float * )) + 256; /* cost, is_x and delta */
353
354 if( buffer_size < (int) (dims * 2 * sizeof( float )))
355 {
356 buffer_size = dims * 2 * sizeof( float );
357 }
358
359 /* allocate buffers */
360 _buffer.allocate(buffer_size);
361
362 state->buffer = buffer = _buffer;
363 buffer_end = buffer + buffer_size;
364
365 state->idx1 = (int*) buffer;
366 buffer += (size1 + 1) * sizeof( int );
367
368 state->idx2 = (int*) buffer;
369 buffer += (size2 + 1) * sizeof( int );
370
371 state->s = (float *) buffer;
372 buffer += (size1 + 1) * sizeof( float );
373
374 state->d = (float *) buffer;
375 buffer += (size2 + 1) * sizeof( float );
376
377 /* sum up the supply and demand */
378 for( i = 0; i < size1; i++ )
379 {
380 float weight = signature1[i * (dims + 1)];

Callers 1

cvCalcEMD2Function · 0.85

Calls 2

icvRusselFunction · 0.85
allocateMethod · 0.45

Tested by

no test coverage detected