#include "fie.h"
#include "oal_aloc.h"
FHANDLE fnSMP_magic_wand( FHANDLE hsrc, PNT_T point, DOUBLE band, INT *exerr );
FHANDLE fnSMP_magic_wand( FHANDLE hsrc, PNT_T point, DOUBLE band, INT *exerr )
{
INT ret = F_ERR_UNKNOWN;
INT channels, type, width, height;
INT ch_cur;
UINT blobno;
DOUBLE *dens = NULL, *tlow = NULL, *thigh = NULL;
PNT_T offset;
FHANDLE hbin = NULL;
FHANDLE hblob = NULL;
FHANDLE hreg = NULL;
F_MEASURE_PARAMS params;
offset.x = 0;
offset.y = 0;
params.max_runs = 0;
params.max_blobs = 0;
params.max_rows = 0;
params.color_mode = F_MEASURE_WHITEFG_BLACKBG;
params.neighborhood = 4;
params.precalc_features = 0;
params.keep_results_after_overflow = FALSE;
ret = fnFIE_img_get_params( hsrc, &channels, &type, NULL, &width, &height );
if ( ret != F_ERR_NONE )
goto EXIT;
ret = F_ERR_INVALID_IMAGE;
if (
type != F_IMG_UC8 &&
type != F_IMG_S16 &&
type != F_IMG_US16 &&
type != F_IMG_DOUBLE &&
type != F_IMG_RGBQUAD
)
goto EXIT;
if ( type == F_IMG_RGBQUAD && channels != 1 )
goto EXIT;
ret = F_ERR_INVALID_PARAM;
if ( point.x < 0 || width - 1 < point.x ||
point.y < 0 || height - 1 < point.y )
goto EXIT;
if ( band < 0 )
goto EXIT;
if ( type == F_IMG_RGBQUAD )
channels = 3;
ret = F_ERR_NOMEMORY;
dens = (DOUBLE*)fnOAL_calloc( channels, sizeof( DOUBLE ) );
if ( dens == NULL )
goto EXIT;
tlow = (DOUBLE*)fnOAL_calloc( channels, sizeof( DOUBLE ) );
if ( tlow == NULL )
goto EXIT;
thigh = (DOUBLE*)fnOAL_calloc( channels, sizeof( DOUBLE ) );
if ( thigh == NULL )
goto EXIT;
hbin = fnFIE_img_root_alloc( F_IMG_BIN, 1, width, height );
if ( hbin == NULL )
goto EXIT;
ret = fnFIE_img_get_subdens( hsrc, (DOUBLE)point.x, (DOUBLE)point.y, F_SAMPLING_NN, dens );
if ( ret != F_ERR_NONE )
goto EXIT;
for ( ch_cur = 0; ch_cur < channels; ch_cur++ )
{
tlow[ch_cur] = dens[ch_cur] - band;
thigh[ch_cur] = dens[ch_cur] + band;
}
ret = fnFIE_band_threshold_ch( hsrc, hbin, tlow, thigh, TRUE );
if ( ret != F_ERR_NONE )
goto EXIT;
hblob = fnFIE_measure_execute( hbin, offset, ¶ms, &ret );
if ( ret != F_ERR_NONE )
goto EXIT;
ret = fnFIE_measure_get_blobno_on_xy( hblob, point.x, point.y, &blobno );
if ( ret != F_ERR_NONE )
goto EXIT;
hreg = fnFIE_measure_get_region( hblob, blobno, &ret );
if ( ret != F_ERR_NONE )
goto EXIT;
ret = F_ERR_NONE;
EXIT:
fnOAL_free( tlow );
fnOAL_free( thigh );
fnOAL_free( dens );
fnFIE_free_object( hbin );
fnFIE_free_object( hblob );
if ( exerr != NULL )
*exerr = ret;
return hreg;
}
static INT execute()
{
INT ret = F_ERR_UNKNOWN;
DOUBLE band;
FHANDLE hsrc = NULL;
FHANDLE hreg = NULL;
FHANDLE hresult = NULL;
PNT_T point;
PNT_T offset;
point.x = 130;
point.y = 60;
band = 30;
ret = fnFIE_load_bmp( "src.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8 );
if ( ret != F_ERR_NONE )
goto EXIT;
hreg = fnSMP_magic_wand( hsrc, point, band, &ret );
if ( ret != F_ERR_NONE )
goto EXIT;
ret = F_ERR_NOMEMORY;
hresult = fnFIE_img_root_alloc(
F_IMG_UC8,
1,
fnFIE_img_get_width( hsrc ),
fnFIE_img_get_height( hsrc )
);
if ( hresult == NULL )
goto EXIT;
ret = fnFIE_img_clear( hresult, 0 );
if ( ret != F_ERR_NONE )
goto EXIT;
offset.x = 0;
offset.y = 0;
ret = fnFIE_region_decode( hreg, hresult, offset, 255 );
if ( ret != F_ERR_NONE )
goto EXIT;
ret = fnFIE_save_bmp( "region.bmp", hresult );
if ( ret != F_ERR_NONE )
goto EXIT;
EXIT:
fnFIE_free_object( hsrc );
fnFIE_free_object( hreg );
fnFIE_free_object( hresult );
return ret;
}
INT main()
{
INT ret = F_ERR_UNKNOWN;
fnFIE_setup();
ret = execute();
fnFIE_teardown();
return ret;
}