2020-08-27 21:45:09 +00:00
|
|
|
//
|
|
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
|
|
//
|
|
|
|
// This is a commercial product and requires a license to operate.
|
|
|
|
// A trial license can be obtained at https://unidoc.io
|
|
|
|
//
|
|
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
|
|
//
|
|
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
package classer ;import (_dg "github.com/unidoc/unipdf/v3/common";_c "github.com/unidoc/unipdf/v3/internal/jbig2/basic";_f "github.com/unidoc/unipdf/v3/internal/jbig2/bitmap";_b "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_a "image";_g "math";);
|
|
|
|
func DefaultSettings ()Settings {_abc :=&Settings {};_abc .SetDefault ();return *_abc };var _gc bool ;func (_eg *Classer )addPageComponents (_aa *_f .Bitmap ,_da *_f .Boxes ,_ef *_f .Bitmaps ,_de int ,_fagd Method )error {const _bg ="\u0043l\u0061\u0073\u0073\u0065r\u002e\u0041\u0064\u0064\u0050a\u0067e\u0043o\u006d\u0070\u006f\u006e\u0065\u006e\u0074s";
|
|
|
|
if _aa ==nil {return _b .Error (_bg ,"\u006e\u0069\u006c\u0020\u0069\u006e\u0070\u0075\u0074 \u0070\u0061\u0067\u0065");};if _da ==nil ||_ef ==nil ||len (*_da )==0{_dg .Log .Trace ("\u0041\u0064\u0064P\u0061\u0067\u0065\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u003a\u0020\u0025\u0073\u002e\u0020\u004e\u006f\u0020\u0063\u006f\u006d\u0070\u006f\u006e\u0065n\u0074\u0073\u0020\u0066\u006f\u0075\u006e\u0064",_aa );
|
|
|
|
return nil ;};var _ag error ;switch _fagd {case RankHaus :_ag =_eg .classifyRankHaus (_da ,_ef ,_de );case Correlation :_ag =_eg .classifyCorrelation (_da ,_ef ,_de );default:_dg .Log .Debug ("\u0055\u006ek\u006e\u006f\u0077\u006e\u0020\u0063\u006c\u0061\u0073\u0073\u0069\u0066\u0079\u0020\u006d\u0065\u0074\u0068\u006f\u0064\u003a\u0020'%\u0076\u0027",_fagd );
|
|
|
|
return _b .Error (_bg ,"\u0075\u006e\u006bno\u0077\u006e\u0020\u0063\u006c\u0061\u0073\u0073\u0069\u0066\u0079\u0020\u006d\u0065\u0074\u0068\u006f\u0064");};if _ag !=nil {return _b .Wrap (_ag ,_bg ,"");};if _ag =_eg .getULCorners (_aa ,_da );_ag !=nil {return _b .Wrap (_ag ,_bg ,"");
|
|
|
|
};_deg :=len (*_da );_eg .BaseIndex +=_deg ;if _ag =_eg .ComponentsNumber .Add (_deg );_ag !=nil {return _b .Wrap (_ag ,_bg ,"");};return nil ;};func (_dca *Classer )classifyRankHaus (_gdd *_f .Boxes ,_cef *_f .Bitmaps ,_cdg int )error {const _ebd ="\u0063\u006ca\u0073\u0073\u0069f\u0079\u0052\u0061\u006e\u006b\u0048\u0061\u0075\u0073";
|
|
|
|
if _gdd ==nil {return _b .Error (_ebd ,"\u0062\u006fx\u0061\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _cef ==nil {return _b .Error (_ebd ,"\u0070\u0069x\u0061\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};_ad :=len (_cef .Values );if _ad ==0{return _b .Error (_ebd ,"e\u006dp\u0074\u0079\u0020\u006e\u0065\u0077\u0020\u0063o\u006d\u0070\u006f\u006een\u0074\u0073");};_fage :=_cef .CountPixels ();_cf :=_dca .Settings .SizeHaus ;_eae :=_f .SelCreateBrick (_cf ,_cf ,_cf /2,_cf /2,_f .SelHit );
|
|
|
|
_adg :=&_f .Bitmaps {Values :make ([]*_f .Bitmap ,_ad )};_eag :=&_f .Bitmaps {Values :make ([]*_f .Bitmap ,_ad )};var (_ccc ,_fdg ,_cefe *_f .Bitmap ;_cdef error ;);for _dfbd :=0;_dfbd < _ad ;_dfbd ++{_ccc ,_cdef =_cef .GetBitmap (_dfbd );if _cdef !=nil {return _b .Wrap (_cdef ,_ebd ,"");
|
|
|
|
};_fdg ,_cdef =_ccc .AddBorderGeneral (JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,0);if _cdef !=nil {return _b .Wrap (_cdef ,_ebd ,"");};_cefe ,_cdef =_f .Dilate (nil ,_fdg ,_eae );if _cdef !=nil {return _b .Wrap (_cdef ,_ebd ,"");};_adg .Values [_ad ]=_fdg ;
|
|
|
|
_eag .Values [_ad ]=_cefe ;};_bcg ,_cdef :=_f .Centroids (_adg .Values );if _cdef !=nil {return _b .Wrap (_cdef ,_ebd ,"");};if _cdef =_bcg .Add (_dca .CentroidPoints );_cdef !=nil {_dg .Log .Trace ("\u004e\u006f\u0020\u0063en\u0074\u0072\u006f\u0069\u0064\u0073\u0020\u0074\u006f\u0020\u0061\u0064\u0064");
|
|
|
|
};if _dca .Settings .RankHaus ==1.0{_cdef =_dca .classifyRankHouseOne (_gdd ,_cef ,_adg ,_eag ,_bcg ,_cdg );}else {_cdef =_dca .classifyRankHouseNonOne (_gdd ,_cef ,_adg ,_eag ,_bcg ,_fage ,_cdg );};if _cdef !=nil {return _b .Wrap (_cdef ,_ebd ,"");};return nil ;
|
|
|
|
};func (_agd *Classer )getULCorners (_fc *_f .Bitmap ,_ae *_f .Boxes )error {const _aaf ="\u0067\u0065\u0074U\u004c\u0043\u006f\u0072\u006e\u0065\u0072\u0073";if _fc ==nil {return _b .Error (_aaf ,"\u006e\u0069l\u0020\u0069\u006da\u0067\u0065\u0020\u0062\u0069\u0074\u006d\u0061\u0070");
|
|
|
|
};if _ae ==nil {return _b .Error (_aaf ,"\u006e\u0069\u006c\u0020\u0062\u006f\u0075\u006e\u0064\u0073");};if _agd .PtaUL ==nil {_agd .PtaUL =&_f .Points {};};_ab :=len (*_ae );var (_ce ,_gg ,_db ,_df int ;_cde ,_fd ,_ege ,_bgf float32 ;_aeb error ;_fe *_a .Rectangle ;
|
|
|
|
_dee *_f .Bitmap ;_gfe _a .Point ;);for _gag :=0;_gag < _ab ;_gag ++{_ce =_agd .BaseIndex +_gag ;if _cde ,_fd ,_aeb =_agd .CentroidPoints .GetGeometry (_ce );_aeb !=nil {return _b .Wrap (_aeb ,_aaf ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0050o\u0069\u006e\u0074\u0073");
|
|
|
|
};if _gg ,_aeb =_agd .ClassIDs .Get (_ce );_aeb !=nil {return _b .Wrap (_aeb ,_aaf ,"\u0043\u006c\u0061s\u0073\u0049\u0044\u0073\u002e\u0047\u0065\u0074");};if _ege ,_bgf ,_aeb =_agd .CentroidPointsTemplates .GetGeometry (_gg );_aeb !=nil {return _b .Wrap (_aeb ,_aaf ,"\u0043\u0065\u006etr\u006f\u0069\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073");
|
|
|
|
};_aed :=_ege -_cde ;_ed :=_bgf -_fd ;if _aed >=0{_db =int (_aed +0.5);}else {_db =int (_aed -0.5);};if _ed >=0{_df =int (_ed +0.5);}else {_df =int (_ed -0.5);};if _fe ,_aeb =_ae .Get (_gag );_aeb !=nil {return _b .Wrap (_aeb ,_aaf ,"");};_ece ,_dfc :=_fe .Min .X ,_fe .Min .Y ;
|
|
|
|
_dee ,_aeb =_agd .UndilatedTemplates .GetBitmap (_gg );if _aeb !=nil {return _b .Wrap (_aeb ,_aaf ,"\u0055\u006e\u0064\u0069\u006c\u0061\u0074\u0065\u0064\u0054e\u006d\u0070\u006c\u0061\u0074\u0065\u0073.\u0047\u0065\u0074\u0028\u0069\u0043\u006c\u0061\u0073\u0073\u0029");
|
|
|
|
};_gfe ,_aeb =_be (_fc ,_ece ,_dfc ,_db ,_df ,_dee );if _aeb !=nil {return _b .Wrap (_aeb ,_aaf ,"");};_agd .PtaUL .AddPoint (float32 (_ece -_db +_gfe .X ),float32 (_dfc -_df +_gfe .Y ));};return nil ;};const (RankHaus Method =iota ;Correlation ;);type Classer struct{BaseIndex int ;
|
|
|
|
Settings Settings ;ComponentsNumber *_c .IntSlice ;TemplateAreas *_c .IntSlice ;Widths map[int ]int ;Heights map[int ]int ;NumberOfClasses int ;ClassInstances *_f .BitmapsArray ;UndilatedTemplates *_f .Bitmaps ;DilatedTemplates *_f .Bitmaps ;TemplatesSize _c .IntsMap ;
|
|
|
|
FgTemplates *_c .NumSlice ;CentroidPoints *_f .Points ;CentroidPointsTemplates *_f .Points ;ClassIDs *_c .IntSlice ;ComponentPageNumbers *_c .IntSlice ;PtaUL *_f .Points ;PtaLL *_f .Points ;};var TwoByTwoWalk =[]int {0,0,0,1,-1,0,0,-1,1,0,-1,1,1,1,-1,-1,1,-1,0,-2,2,0,0,2,-2,0,-1,-2,1,-2,2,-1,2,1,1,2,-1,2,-2,1,-2,-1,-2,-2,2,-2,2,2,-2,2};
|
|
|
|
const (MaxConnCompWidth =350;MaxCharCompWidth =350;MaxWordCompWidth =1000;MaxCompHeight =120;);type Method int ;func (_bcf *Classer )classifyRankHouseNonOne (_fcf *_f .Boxes ,_cebb ,_gdf ,_ffd *_f .Bitmaps ,_gfeg *_f .Points ,_ceaa *_c .NumSlice ,_bdc int )(_fee error ){const _cbca ="\u0043\u006c\u0061\u0073s\u0065\u0072\u002e\u0063\u006c\u0061\u0073\u0073\u0069\u0066y\u0052a\u006e\u006b\u0048\u006f\u0075\u0073\u0065O\u006e\u0065";
|
|
|
|
var (_gbe ,_bab ,_bed ,_cgdb float32 ;_bfb ,_dbd ,_bdg int ;_edg ,_bfag ,_ged ,_ddb ,_dbe *_f .Bitmap ;_cbbb ,_fgg bool ;);_ced :=_f .MakePixelSumTab8 ();for _edgf :=0;_edgf < len (_cebb .Values );_edgf ++{if _bfag ,_fee =_gdf .GetBitmap (_edgf );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"b\u006d\u0073\u0031\u002e\u0047\u0065\u0074\u0028\u0069\u0029");
|
|
|
|
};if _bfb ,_fee =_ceaa .GetInt (_edgf );_fee !=nil {_dg .Log .Trace ("\u0047\u0065t\u0074\u0069\u006e\u0067 \u0046\u0047T\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073 \u0061\u0074\u003a\u0020\u0025\u0064\u0020\u0066\u0061\u0069\u006c\u0065d\u003a\u0020\u0025\u0076",_edgf ,_fee );
|
|
|
|
};if _ged ,_fee =_ffd .GetBitmap (_edgf );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"b\u006d\u0073\u0032\u002e\u0047\u0065\u0074\u0028\u0069\u0029");};if _gbe ,_bab ,_fee =_gfeg .GetGeometry (_edgf );_fee !=nil {return _b .Wrapf (_fee ,_cbca ,"\u0070t\u0061[\u0069\u005d\u002e\u0047\u0065\u006f\u006d\u0065\u0074\u0072\u0079");
|
|
|
|
};_dfda :=len (_bcf .UndilatedTemplates .Values );_cbbb =false ;_fcfd :=_age (_bcf ,_bfag );for _bdg =_fcfd .Next ();_bdg > -1;{if _ddb ,_fee =_bcf .UndilatedTemplates .GetBitmap (_bdg );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"\u0070\u0069\u0078\u0061\u0074\u002e\u005b\u0069\u0043l\u0061\u0073\u0073\u005d");
|
|
|
|
};if _dbd ,_fee =_bcf .FgTemplates .GetInt (_bdg );_fee !=nil {_dg .Log .Trace ("\u0047\u0065\u0074\u0074\u0069\u006eg\u0020\u0046\u0047\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u005b\u0025d\u005d\u0020\u0066\u0061\u0069\u006c\u0065d\u003a\u0020\u0025\u0076",_bdg ,_fee );
|
|
|
|
};if _dbe ,_fee =_bcf .DilatedTemplates .GetBitmap (_bdg );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"\u0070\u0069\u0078\u0061\u0074\u0064\u005b\u0069\u0043l\u0061\u0073\u0073\u005d");};if _bed ,_cgdb ,_fee =_bcf .CentroidPointsTemplates .GetGeometry (_bdg );
|
|
|
|
_fee !=nil {return _b .Wrap (_fee ,_cbca ,"\u0043\u0065\u006et\u0072\u006f\u0069\u0064P\u006f\u0069\u006e\u0074\u0073\u0054\u0065m\u0070\u006c\u0061\u0074\u0065\u0073\u005b\u0069\u0043\u006c\u0061\u0073\u0073\u005d");};_fgg ,_fee =_f .RankHausTest (_bfag ,_ged ,_ddb ,_dbe ,_gbe -_bed ,_bab -_cgdb ,MaxDiffWidth ,MaxDiffHeight ,_bfb ,_dbd ,float32 (_bcf .Settings .RankHaus ),_ced );
|
|
|
|
if _fee !=nil {return _b .Wrap (_fee ,_cbca ,"");};if _fgg {_cbbb =true ;if _fee =_bcf .ClassIDs .Add (_bdg );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"");};if _fee =_bcf .ComponentPageNumbers .Add (_bdc );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"");
|
|
|
|
};if _bcf .Settings .KeepClassInstances {_ggc ,_fea :=_bcf .ClassInstances .GetBitmaps (_bdg );if _fea !=nil {return _b .Wrap (_fea ,_cbca ,"\u0063\u002e\u0050\u0069\u0078\u0061\u0061\u002e\u0047\u0065\u0074B\u0069\u0074\u006d\u0061\u0070\u0073\u0028\u0069\u0043\u006ca\u0073\u0073\u0029");
|
|
|
|
};if _edg ,_fea =_cebb .GetBitmap (_edgf );_fea !=nil {return _b .Wrap (_fea ,_cbca ,"\u0070i\u0078\u0061\u005b\u0069\u005d");};_ggc .Values =append (_ggc .Values ,_edg );_dcdf ,_fea :=_fcf .Get (_edgf );if _fea !=nil {return _b .Wrap (_fea ,_cbca ,"b\u006f\u0078\u0061\u002e\u0047\u0065\u0074\u0028\u0069\u0029");
|
|
|
|
};_ggc .Boxes =append (_ggc .Boxes ,_dcdf );};break ;};};if !_cbbb {if _fee =_bcf .ClassIDs .Add (_dfda );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"\u0021\u0066\u006f\u0075\u006e\u0064");};if _fee =_bcf .ComponentPageNumbers .Add (_bdc );_fee !=nil {return _b .Wrap (_fee ,_cbca ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
|
|
};_cff :=&_f .Bitmaps {};_edg =_cebb .Values [_edgf ];_cff .AddBitmap (_edg );_cgdg ,_efd :=_edg .Width ,_edg .Height ;_bcf .TemplatesSize .Add (uint64 (_cgdg )*uint64 (_efd ),_dfda );_ceg ,_cec :=_fcf .Get (_edgf );if _cec !=nil {return _b .Wrap (_cec ,_cbca ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
|
|
};_cff .AddBox (_ceg );_bcf .ClassInstances .AddBitmaps (_cff );_bcf .CentroidPointsTemplates .AddPoint (_gbe ,_bab );_bcf .UndilatedTemplates .AddBitmap (_bfag );_bcf .DilatedTemplates .AddBitmap (_ged );_bcf .FgTemplates .AddInt (_bfb );};};_bcf .NumberOfClasses =len (_bcf .UndilatedTemplates .Values );
|
|
|
|
return nil ;};func (_cdc *Classer )ComputeLLCorners ()(_cc error ){const _ba ="\u0043l\u0061\u0073\u0073\u0065\u0072\u002e\u0043\u006f\u006d\u0070\u0075t\u0065\u004c\u004c\u0043\u006f\u0072\u006e\u0065\u0072\u0073";if _cdc .PtaUL ==nil {return _b .Error (_ba ,"\u0055\u004c\u0020\u0043or\u006e\u0065\u0072\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
|
|
};_ec :=len (*_cdc .PtaUL );_cdc .PtaLL =&_f .Points {};var (_ea ,_dge float32 ;_fag ,_cb int ;_gd *_f .Bitmap ;);for _ecf :=0;_ecf < _ec ;_ecf ++{_ea ,_dge ,_cc =_cdc .PtaUL .GetGeometry (_ecf );if _cc !=nil {_dg .Log .Debug ("\u0047e\u0074\u0074\u0069\u006e\u0067\u0020\u0050\u0074\u0061\u0055\u004c \u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_cc );
|
|
|
|
return _b .Wrap (_cc ,_ba ,"\u0050\u0074\u0061\u0055\u004c\u0020\u0047\u0065\u006fm\u0065\u0074\u0072\u0079");};_fag ,_cc =_cdc .ClassIDs .Get (_ecf );if _cc !=nil {_dg .Log .Debug ("\u0047\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0043\u006c\u0061s\u0073\u0049\u0044\u0020\u0066\u0061\u0069\u006c\u0065\u0064:\u0020\u0025\u0076",_cc );
|
|
|
|
return _b .Wrap (_cc ,_ba ,"\u0043l\u0061\u0073\u0073\u0049\u0044");};_gd ,_cc =_cdc .UndilatedTemplates .GetBitmap (_fag );if _cc !=nil {_dg .Log .Debug ("\u0047\u0065t\u0074\u0069\u006e\u0067 \u0055\u006ed\u0069\u006c\u0061\u0074\u0065\u0064\u0054\u0065m\u0070\u006c\u0061\u0074\u0065\u0073\u0020\u0066\u0061\u0069\u006c\u0065d\u003a\u0020\u0025\u0076",_cc );
|
|
|
|
return _b .Wrap (_cc ,_ba ,"\u0055\u006e\u0064\u0069la\u0074\u0065\u0064\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073");};_cb =_gd .Height ;_cdc .PtaLL .AddPoint (_ea ,_dge +float32 (_cb ));};return nil ;};func _be (_dfb *_f .Bitmap ,_dab ,_bae ,_cdce ,_fed int ,_dad *_f .Bitmap )(_fef _a .Point ,_dbc error ){const _fab ="\u0066i\u006e\u0061\u006c\u0041l\u0069\u0067\u006e\u006d\u0065n\u0074P\u006fs\u0069\u0074\u0069\u006f\u006e\u0069\u006eg";
|
|
|
|
if _dfb ==nil {return _fef ,_b .Error (_fab ,"\u0073\u006f\u0075\u0072ce\u0020\u006e\u006f\u0074\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};if _dad ==nil {return _fef ,_b .Error (_fab ,"t\u0065\u006d\u0070\u006cat\u0065 \u006e\u006f\u0074\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
|
|
};_aec ,_af :=_dad .Width ,_dad .Height ;_agf ,_gb :=_dab -_cdce -JbAddedPixels ,_bae -_fed -JbAddedPixels ;_dg .Log .Trace ("\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0079\u003a\u0020\u0027\u0025\u0064'\u002c\u0020\u0077\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0068\u003a \u0027\u0025\u0064\u0027\u002c\u0020\u0062\u0078\u003a\u0020\u0027\u0025d'\u002c\u0020\u0062\u0079\u003a\u0020\u0027\u0025\u0064\u0027",_dab ,_bae ,_aec ,_af ,_agf ,_gb );
|
|
|
|
_caa ,_dbc :=_f .Rect (_agf ,_gb ,_aec ,_af );if _dbc !=nil {return _fef ,_b .Wrap (_dbc ,_fab ,"");};_fda ,_ ,_dbc :=_dfb .ClipRectangle (_caa );if _dbc !=nil {_dg .Log .Error ("\u0043a\u006e\u0027\u0074\u0020\u0063\u006c\u0069\u0070\u0020\u0072\u0065c\u0074\u0061\u006e\u0067\u006c\u0065\u003a\u0020\u0025\u0076",_caa );
|
|
|
|
return _fef ,_b .Wrap (_dbc ,_fab ,"");};_bac :=_f .New (_fda .Width ,_fda .Height );_abf :=_g .MaxInt32 ;var _dfd ,_ge ,_aecc ,_bb ,_fcd int ;for _dfd =-1;_dfd <=1;_dfd ++{for _ge =-1;_ge <=1;_ge ++{if _ ,_dbc =_f .Copy (_bac ,_fda );_dbc !=nil {return _fef ,_b .Wrap (_dbc ,_fab ,"");
|
|
|
|
};if _dbc =_bac .RasterOperation (_ge ,_dfd ,_aec ,_af ,_f .PixSrcXorDst ,_dad ,0,0);_dbc !=nil {return _fef ,_b .Wrap (_dbc ,_fab ,"");};_aecc =_bac .CountPixels ();if _aecc < _abf {_bb =_ge ;_fcd =_dfd ;_abf =_aecc ;};};};_fef .X =_bb ;_fef .Y =_fcd ;
|
|
|
|
return _fef ,nil ;};func (_eaf *Classer )classifyCorrelation (_eb *_f .Boxes ,_dabc *_f .Bitmaps ,_cea int )error {const _ega ="\u0063\u006c\u0061\u0073si\u0066\u0079\u0043\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e";if _eb ==nil {return _b .Error (_ega ,"\u006e\u0065\u0077\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0020\u0062\u006f\u0075\u006e\u0064\u0069\u006e\u0067\u0020\u0062o\u0078\u0065\u0073\u0020\u006eo\u0074\u0020f\u006f\u0075\u006e\u0064");
|
|
|
|
};if _dabc ==nil {return _b .Error (_ega ,"\u006e\u0065wC\u006f\u006d\u0070o\u006e\u0065\u006e\u0074s b\u0069tm\u0061\u0070\u0020\u0061\u0072\u0072\u0061y \u006e\u006f\u0074\u0020\u0066\u006f\u0075n\u0064");};_dade :=len (_dabc .Values );if _dade ==0{_dg .Log .Debug ("\u0063l\u0061\u0073s\u0069\u0066\u0079C\u006f\u0072\u0072\u0065\u006c\u0061\u0074i\u006f\u006e\u0020\u002d\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0070\u0069\u0078\u0061s\u0020\u0069\u0073\u0020\u0065\u006d\u0070\u0074\u0079");
|
|
|
|
return nil ;};var (_gae ,_dd *_f .Bitmap ;_acg error ;);_bfa :=&_f .Bitmaps {Values :make ([]*_f .Bitmap ,_dade )};for _bc ,_cad :=range _dabc .Values {_dd ,_acg =_cad .AddBorderGeneral (JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,0);if _acg !=nil {return _b .Wrap (_acg ,_ega ,"");
|
|
|
|
};_bfa .Values [_bc ]=_dd ;};_eca :=_eaf .FgTemplates ;_cdcb :=_f .MakePixelSumTab8 ();_cg :=_f .MakePixelCentroidTab8 ();_fagc :=make ([]int ,_dade );_dfa :=make ([][]int ,_dade );_bad :=_f .Points (make ([]_f .Point ,_dade ));_cbb :=&_bad ;var (_cbg ,_cbbf int ;
|
|
|
|
_fabd ,_cbc ,_gaf int ;_daa ,_aae int ;_dadg byte ;);for _ccd ,_dbb :=range _bfa .Values {_dfa [_ccd ]=make ([]int ,_dbb .Height );_cbg =0;_cbbf =0;_cbc =(_dbb .Height -1)*_dbb .RowStride ;_fabd =0;for _aae =_dbb .Height -1;_aae >=0;_aae ,_cbc =_aae -1,_cbc -_dbb .RowStride {_dfa [_ccd ][_aae ]=_fabd ;
|
|
|
|
_gaf =0;for _daa =0;_daa < _dbb .RowStride ;_daa ++{_dadg =_dbb .Data [_cbc +_daa ];_gaf +=_cdcb [_dadg ];_cbg +=_cg [_dadg ]+_daa *8*_cdcb [_dadg ];};_fabd +=_gaf ;_cbbf +=_gaf *_aae ;};_fagc [_ccd ]=_fabd ;if _fabd > 0{(*_cbb )[_ccd ]=_f .Point {X :float32 (_cbg )/float32 (_fabd ),Y :float32 (_cbbf )/float32 (_fabd )};
|
|
|
|
}else {(*_cbb )[_ccd ]=_f .Point {X :float32 (_dbb .Width )/float32 (2),Y :float32 (_dbb .Height )/float32 (2)};};};if _acg =_eaf .CentroidPoints .Add (_cbb );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0063\u0065\u006et\u0072\u006f\u0069\u0064\u0020\u0061\u0064\u0064");
|
|
|
|
};var (_aca ,_bba ,_gec int ;_fg float64 ;_gfc ,_abe ,_fagb ,_bd float32 ;_aab ,_bgb _f .Point ;_afd bool ;_dfg *similarTemplatesFinder ;_dgd int ;_abb *_f .Bitmap ;_ggg *_a .Rectangle ;_bdd *_f .Bitmaps ;);for _dgd ,_dd =range _bfa .Values {_bba =_fagc [_dgd ];
|
|
|
|
if _gfc ,_abe ,_acg =_cbb .GetGeometry (_dgd );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0070t\u0061\u0020\u002d\u0020\u0069");};_afd =false ;_geb :=len (_eaf .UndilatedTemplates .Values );_dfg =_age (_eaf ,_dd );for _egg :=_dfg .Next ();_egg > -1;{if _abb ,_acg =_eaf .UndilatedTemplates .GetBitmap (_egg );
|
|
|
|
_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0075\u006e\u0069dl\u0061\u0074\u0065\u0064\u005b\u0069\u0063\u006c\u0061\u0073\u0073\u005d\u0020\u003d\u0020\u0062\u006d\u0032");};if _gec ,_acg =_eca .GetInt (_egg );_acg !=nil {_dg .Log .Trace ("\u0046\u0047\u0020T\u0065\u006d\u0070\u006ca\u0074\u0065\u0020\u005b\u0069\u0063\u006ca\u0073\u0073\u005d\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_acg );
|
|
|
|
};if _fagb ,_bd ,_acg =_eaf .CentroidPointsTemplates .GetGeometry (_egg );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0050\u006f\u0069\u006e\u0074T\u0065\u006d\u0070\u006c\u0061\u0074e\u0073\u005b\u0069\u0063\u006c\u0061\u0073\u0073\u005d\u0020\u003d\u0020\u00782\u002c\u0079\u0032\u0020");
|
|
|
|
};if _eaf .Settings .WeightFactor > 0.0{if _aca ,_acg =_eaf .TemplateAreas .Get (_egg );_acg !=nil {_dg .Log .Trace ("\u0054\u0065\u006dp\u006c\u0061\u0074\u0065A\u0072\u0065\u0061\u0073\u005b\u0069\u0063l\u0061\u0073\u0073\u005d\u0020\u003d\u0020\u0061\u0072\u0065\u0061\u0020\u0025\u0076",_acg );
|
|
|
|
};_fg =_eaf .Settings .Thresh +(1.0-_eaf .Settings .Thresh )*_eaf .Settings .WeightFactor *float64 (_gec )/float64 (_aca );}else {_fg =_eaf .Settings .Thresh ;};_feg ,_bbe :=_f .CorrelationScoreThresholded (_dd ,_abb ,_bba ,_gec ,_aab .X -_bgb .X ,_aab .Y -_bgb .Y ,MaxDiffWidth ,MaxDiffHeight ,_cdcb ,_dfa [_dgd ],float32 (_fg ));
|
|
|
|
if _bbe !=nil {return _b .Wrap (_bbe ,_ega ,"");};if _gc {var (_ceb ,_fca float64 ;_cbe ,_dc int ;);_ceb ,_bbe =_f .CorrelationScore (_dd ,_abb ,_bba ,_gec ,_gfc -_fagb ,_abe -_bd ,MaxDiffWidth ,MaxDiffHeight ,_cdcb );if _bbe !=nil {return _b .Wrap (_bbe ,_ega ,"d\u0065\u0062\u0075\u0067Co\u0072r\u0065\u006c\u0061\u0074\u0069o\u006e\u0053\u0063\u006f\u0072\u0065");
|
|
|
|
};_fca ,_bbe =_f .CorrelationScoreSimple (_dd ,_abb ,_bba ,_gec ,_gfc -_fagb ,_abe -_bd ,MaxDiffWidth ,MaxDiffHeight ,_cdcb );if _bbe !=nil {return _b .Wrap (_bbe ,_ega ,"d\u0065\u0062\u0075\u0067Co\u0072r\u0065\u006c\u0061\u0074\u0069o\u006e\u0053\u0063\u006f\u0072\u0065");
|
|
|
|
};_cbe =int (_g .Sqrt (_ceb *float64 (_bba )*float64 (_gec )));_dc =int (_g .Sqrt (_fca *float64 (_bba )*float64 (_gec )));if (_ceb >=_fg )!=(_fca >=_fg ){return _b .Errorf (_ega ,"\u0064\u0065\u0062\u0075\u0067\u0020\u0043\u006f\u0072r\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020\u0073\u0063\u006f\u0072\u0065\u0020\u006d\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020-\u0020\u0025d\u0028\u00250\u002e\u0034\u0066\u002c\u0020\u0025\u0076\u0029\u0020\u0076\u0073\u0020\u0025d(\u0025\u0030\u002e\u0034\u0066\u002c\u0020\u0025\u0076)\u0020\u0025\u0030\u002e\u0034\u0066",_cbe ,_ceb ,_ceb >=_fg ,_dc ,_fca ,_fca >=_fg ,_ceb -_fca );
|
|
|
|
};if _ceb >=_fg !=_feg {return _b .Errorf (_ega ,"\u0064\u0065\u0062\u0075\u0067\u0020\u0043o\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e \u0073\u0063\u006f\u0072\u0065 \u004d\u0069\u0073\u006d\u0061t\u0063\u0068 \u0062\u0065\u0074w\u0065\u0065\u006e\u0020\u0063\u006frr\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020/\u0020\u0074\u0068\u0072\u0065s\u0068\u006f\u006c\u0064\u002e\u0020\u0043\u006f\u006dpa\u0072\u0069\u0073\u006f\u006e:\u0020\u0025\u0030\u002e\u0034\u0066\u0028\u0025\u0030\u002e\u0034\u0066\u002c\u0020\u0025\u0064\u0029\u0020\u003e\u003d\u0020\u00250\u002e\u0034\u0066\u0028\u0025\u0030\u002e\u0034\u0066\u0029\u0020\u0076\u0073\u0020\u0025\u0076",_ceb ,_ceb *float64 (_bba )*float64 (_gec ),_cbe ,_fg ,float32 (_fg )*float32 (_bba )*float32 (_gec ),_feg );
|
|
|
|
};};if _feg {_afd =true ;if _bbe =_eaf .ClassIDs .Add (_egg );_bbe !=nil {return _b .Wrap (_bbe ,_ega ,"\u006f\u0076\u0065\u0072\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006c\u0064");};if _bbe =_eaf .ComponentPageNumbers .Add (_cea );_bbe !=nil {return _b .Wrap (_bbe ,_ega ,"\u006f\u0076\u0065\u0072\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006c\u0064");
|
|
|
|
};if _eaf .Settings .KeepClassInstances {if _gae ,_bbe =_dabc .GetBitmap (_dgd );_bbe !=nil {return _b .Wrap (_bbe ,_ega ,"\u004b\u0065\u0065\u0070Cl\u0061\u0073\u0073\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065\u0073\u0020\u002d \u0069");};if _bdd ,_bbe =_eaf .ClassInstances .GetBitmaps (_egg );
|
|
|
|
_bbe !=nil {return _b .Wrap (_bbe ,_ega ,"K\u0065\u0065\u0070\u0043\u006c\u0061s\u0073\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065s\u0020\u002d\u0020i\u0043l\u0061\u0073\u0073");};_bdd .AddBitmap (_gae );if _ggg ,_bbe =_eb .Get (_dgd );_bbe !=nil {return _b .Wrap (_bbe ,_ega ,"\u004be\u0065p\u0043\u006c\u0061\u0073\u0073I\u006e\u0073t\u0061\u006e\u0063\u0065\u0073");
|
|
|
|
};_bdd .AddBox (_ggg );};break ;};};if !_afd {if _acg =_eaf .ClassIDs .Add (_geb );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0021\u0066\u006f\u0075\u006e\u0064");};if _acg =_eaf .ComponentPageNumbers .Add (_cea );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
|
|
};_bdd =&_f .Bitmaps {};if _gae ,_acg =_dabc .GetBitmap (_dgd );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_bdd .AddBitmap (_gae );_gcd ,_dde :=_gae .Width ,_gae .Height ;_bgbf :=uint64 (_dde )*uint64 (_gcd );_eaf .TemplatesSize .Add (_bgbf ,_geb );
|
|
|
|
if _ggg ,_acg =_eb .Get (_dgd );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_bdd .AddBox (_ggg );_eaf .ClassInstances .AddBitmaps (_bdd );_eaf .CentroidPointsTemplates .AddPoint (_gfc ,_abe );_eaf .FgTemplates .AddInt (_bba );
|
|
|
|
_eaf .UndilatedTemplates .AddBitmap (_gae );_aca =(_dd .Width -2*JbAddedPixels )*(_dd .Height -2*JbAddedPixels );if _acg =_eaf .TemplateAreas .Add (_aca );_acg !=nil {return _b .Wrap (_acg ,_ega ,"\u0021\u0066\u006f\u0075\u006e\u0064");};};};_eaf .NumberOfClasses =len (_eaf .UndilatedTemplates .Values );
|
|
|
|
return nil ;};func (_fdag *Classer )classifyRankHouseOne (_cfg *_f .Boxes ,_ada ,_gbg ,_cee *_f .Bitmaps ,_gca *_f .Points ,_ebc int )(_agb error ){const _cgd ="\u0043\u006c\u0061\u0073s\u0065\u0072\u002e\u0063\u006c\u0061\u0073\u0073\u0069\u0066y\u0052a\u006e\u006b\u0048\u006f\u0075\u0073\u0065O\u006e\u0065";
|
|
|
|
var (_dfgc ,_eff ,_bfd ,_gce float32 ;_deef int ;_fae ,_cfgg ,_dbf ,_adgf ,_bfc *_f .Bitmap ;_fb ,_dbg bool ;);for _cgc :=0;_cgc < len (_ada .Values );_cgc ++{_cfgg =_gbg .Values [_cgc ];_dbf =_cee .Values [_cgc ];_dfgc ,_eff ,_agb =_gca .GetGeometry (_cgc );
|
|
|
|
if _agb !=nil {return _b .Wrapf (_agb ,_cgd ,"\u0066\u0069\u0072\u0073\u0074\u0020\u0067\u0065\u006fm\u0065\u0074\u0072\u0079");};_bbd :=len (_fdag .UndilatedTemplates .Values );_fb =false ;_agg :=_age (_fdag ,_cfgg );for _deef =_agg .Next ();_deef > -1;
|
|
|
|
{_adgf ,_agb =_fdag .UndilatedTemplates .GetBitmap (_deef );if _agb !=nil {return _b .Wrap (_agb ,_cgd ,"\u0062\u006d\u0033");};_bfc ,_agb =_fdag .DilatedTemplates .GetBitmap (_deef );if _agb !=nil {return _b .Wrap (_agb ,_cgd ,"\u0062\u006d\u0034");};
|
|
|
|
_bfd ,_gce ,_agb =_fdag .CentroidPointsTemplates .GetGeometry (_deef );if _agb !=nil {return _b .Wrap (_agb ,_cgd ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0054\u0065\u006d\u0070l\u0061\u0074\u0065\u0073");};_dbg ,_agb =_f .HausTest (_cfgg ,_dbf ,_adgf ,_bfc ,_dfgc -_bfd ,_eff -_gce ,MaxDiffWidth ,MaxDiffHeight );
|
|
|
|
if _agb !=nil {return _b .Wrap (_agb ,_cgd ,"");};if _dbg {_fb =true ;if _agb =_fdag .ClassIDs .Add (_deef );_agb !=nil {return _b .Wrap (_agb ,_cgd ,"");};if _agb =_fdag .ComponentPageNumbers .Add (_ebc );_agb !=nil {return _b .Wrap (_agb ,_cgd ,"");};
|
|
|
|
if _fdag .Settings .KeepClassInstances {_gfg ,_fcb :=_fdag .ClassInstances .GetBitmaps (_deef );if _fcb !=nil {return _b .Wrap (_fcb ,_cgd ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");};_fae ,_fcb =_ada .GetBitmap (_cgc );if _fcb !=nil {return _b .Wrap (_fcb ,_cgd ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");
|
|
|
|
};_gfg .AddBitmap (_fae );_bfda ,_fcb :=_cfg .Get (_cgc );if _fcb !=nil {return _b .Wrap (_fcb ,_cgd ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");};_gfg .AddBox (_bfda );};break ;};};if !_fb {if _agb =_fdag .ClassIDs .Add (_bbd );_agb !=nil {return _b .Wrap (_agb ,_cgd ,"");
|
|
|
|
};if _agb =_fdag .ComponentPageNumbers .Add (_ebc );_agb !=nil {return _b .Wrap (_agb ,_cgd ,"");};_dcd :=&_f .Bitmaps {};_fae ,_agb =_ada .GetBitmap (_cgc );if _agb !=nil {return _b .Wrap (_agb ,_cgd ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_dcd .Values =append (_dcd .Values ,_fae );
|
|
|
|
_dcf ,_adc :=_fae .Width ,_fae .Height ;_fdag .TemplatesSize .Add (uint64 (_adc )*uint64 (_dcf ),_bbd );_bcd ,_dcae :=_cfg .Get (_cgc );if _dcae !=nil {return _b .Wrap (_dcae ,_cgd ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_dcd .AddBox (_bcd );_fdag .ClassInstances .AddBitmaps (_dcd );
|
|
|
|
_fdag .CentroidPointsTemplates .AddPoint (_dfgc ,_eff );_fdag .UndilatedTemplates .AddBitmap (_cfgg );_fdag .DilatedTemplates .AddBitmap (_dbf );};};return nil ;};const JbAddedPixels =6;const (MaxDiffWidth =2;MaxDiffHeight =2;);type similarTemplatesFinder struct{Classer *Classer ;
|
|
|
|
Width int ;Height int ;Index int ;CurrentNumbers []int ;N int ;};func _age (_ffa *Classer ,_cdgd *_f .Bitmap )*similarTemplatesFinder {return &similarTemplatesFinder {Width :_cdgd .Width ,Height :_cdgd .Height ,Classer :_ffa };};func Init (settings Settings )(*Classer ,error ){const _fa ="\u0063\u006c\u0061s\u0073\u0065\u0072\u002e\u0049\u006e\u0069\u0074";
|
|
|
|
_dgg :=&Classer {Settings :settings ,Widths :map[int ]int {},Heights :map[int ]int {},TemplatesSize :_c .IntsMap {},TemplateAreas :&_c .IntSlice {},ComponentPageNumbers :&_c .IntSlice {},ClassIDs :&_c .IntSlice {},ComponentsNumber :&_c .IntSlice {},CentroidPoints :&_f .Points {},CentroidPointsTemplates :&_f .Points {},UndilatedTemplates :&_f .Bitmaps {},DilatedTemplates :&_f .Bitmaps {},ClassInstances :&_f .BitmapsArray {},FgTemplates :&_c .NumSlice {}};
|
|
|
|
if _cd :=_dgg .Settings .Validate ();_cd !=nil {return nil ,_b .Wrap (_cd ,_fa ,"");};return _dgg ,nil ;};func (_eafc *Settings )SetDefault (){if _eafc .MaxCompWidth ==0{switch _eafc .Components {case _f .ComponentConn :_eafc .MaxCompWidth =MaxConnCompWidth ;
|
|
|
|
case _f .ComponentCharacters :_eafc .MaxCompWidth =MaxCharCompWidth ;case _f .ComponentWords :_eafc .MaxCompWidth =MaxWordCompWidth ;};};if _eafc .MaxCompHeight ==0{_eafc .MaxCompHeight =MaxCompHeight ;};if _eafc .Thresh ==0.0{_eafc .Thresh =0.9;};if _eafc .WeightFactor ==0.0{_eafc .WeightFactor =0.75;
|
|
|
|
};if _eafc .RankHaus ==0.0{_eafc .RankHaus =0.97;};if _eafc .SizeHaus ==0{_eafc .SizeHaus =2;};};func (_e *Classer )AddPage (inputPage *_f .Bitmap ,pageNumber int ,method Method )(_ga error ){const _ca ="\u0043l\u0061s\u0073\u0065\u0072\u002e\u0041\u0064\u0064\u0050\u0061\u0067\u0065";
|
|
|
|
_e .Widths [pageNumber ]=inputPage .Width ;_e .Heights [pageNumber ]=inputPage .Height ;if _ga =_e .verifyMethod (method );_ga !=nil {return _b .Wrap (_ga ,_ca ,"");};_gf ,_bf ,_ga :=inputPage .GetComponents (_e .Settings .Components ,_e .Settings .MaxCompWidth ,_e .Settings .MaxCompHeight );
|
|
|
|
if _ga !=nil {return _b .Wrap (_ga ,_ca ,"");};_dg .Log .Debug ("\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074s\u003a\u0020\u0025\u0076",_gf );if _ga =_e .addPageComponents (inputPage ,_bf ,_gf ,pageNumber ,method );_ga !=nil {return _b .Wrap (_ga ,_ca ,"");
|
|
|
|
};return nil ;};func (_gfd *similarTemplatesFinder )Next ()int {var (_dff ,_ebe ,_dbea ,_bfe int ;_cbbd bool ;_faec *_f .Bitmap ;_bde error ;);for {if _gfd .Index >=25{return -1;};_ebe =_gfd .Width +TwoByTwoWalk [2*_gfd .Index ];_dff =_gfd .Height +TwoByTwoWalk [2*_gfd .Index +1];
|
|
|
|
if _dff < 1||_ebe < 1{_gfd .Index ++;continue ;};if len (_gfd .CurrentNumbers )==0{_gfd .CurrentNumbers ,_cbbd =_gfd .Classer .TemplatesSize .GetSlice (uint64 (_ebe )*uint64 (_dff ));if !_cbbd {_gfd .Index ++;continue ;};_gfd .N =0;};_dbea =len (_gfd .CurrentNumbers );
|
|
|
|
for ;_gfd .N < _dbea ;_gfd .N ++{_bfe =_gfd .CurrentNumbers [_gfd .N ];_faec ,_bde =_gfd .Classer .DilatedTemplates .GetBitmap (_bfe );if _bde !=nil {_dg .Log .Debug ("\u0046\u0069\u006e\u0064\u004e\u0065\u0078\u0074\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u003a\u0020\u0074\u0065\u006d\u0070\u006c\u0061t\u0065\u0020\u006e\u006f\u0074 \u0066\u006fu\u006e\u0064\u003a\u0020");
|
|
|
|
return 0;};if _faec .Width -2*JbAddedPixels ==_ebe &&_faec .Height -2*JbAddedPixels ==_dff {return _bfe ;};};_gfd .Index ++;_gfd .CurrentNumbers =nil ;};};func (_ccf *Classer )verifyMethod (_ff Method )error {if _ff !=RankHaus &&_ff !=Correlation {return _b .Error ("\u0076\u0065\u0072i\u0066\u0079\u004d\u0065\u0074\u0068\u006f\u0064","\u0069\u006e\u0076\u0061li\u0064\u0020\u0063\u006c\u0061\u0073\u0073\u0065\u0072\u0020\u006d\u0065\u0074\u0068o\u0064");
|
|
|
|
};return nil ;};type Settings struct{MaxCompWidth int ;MaxCompHeight int ;SizeHaus int ;RankHaus float64 ;Thresh float64 ;WeightFactor float64 ;KeepClassInstances bool ;Components _f .Component ;Method Method ;};func (_acac Settings )Validate ()error {const _fdc ="\u0053\u0065\u0074\u0074\u0069\u006e\u0067\u0073\u002e\u0056\u0061\u006ci\u0064\u0061\u0074\u0065";
|
|
|
|
if _acac .Thresh < 0.4||_acac .Thresh > 0.98{return _b .Error (_fdc ,"\u006a\u0062i\u0067\u0032\u0020\u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0074\u0068\u0072\u0065\u0073\u0068\u0020\u006e\u006f\u0074\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u005b\u0030\u002e\u0034\u0020\u002d\u0020\u0030\u002e\u0039\u0038\u005d");
|
|
|
|
};if _acac .WeightFactor < 0.0||_acac .WeightFactor > 1.0{return _b .Error (_fdc ,"\u006a\u0062i\u0067\u0032\u0020\u0065\u006ec\u006f\u0064\u0065\u0072\u0020w\u0065\u0069\u0067\u0068\u0074\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u006e\u006f\u0074\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u005b\u0030\u002e\u0030\u0020\u002d\u0020\u0031\u002e\u0030\u005d");
|
|
|
|
};if _acac .RankHaus < 0.5||_acac .RankHaus > 1.0{return _b .Error (_fdc ,"\u006a\u0062\u0069\u0067\u0032\u0020\u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0072a\u006e\u006b\u0020\u0068\u0061\u0075\u0073\u0020\u0076\u0061\u006c\u0075\u0065 \u006e\u006f\u0074\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065 [\u0030\u002e\u0035\u0020\u002d\u0020\u0031\u002e\u0030\u005d");
|
|
|
|
};if _acac .SizeHaus < 1||_acac .SizeHaus > 10{return _b .Error (_fdc ,"\u006a\u0062\u0069\u0067\u0032 \u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0073\u0069\u007a\u0065\u0020h\u0061\u0075\u0073\u0020\u0076\u0061\u006c\u0075\u0065\u0020\u006e\u006f\u0074\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u005b\u0031\u0020\u002d\u0020\u0031\u0030]");
|
|
|
|
};switch _acac .Components {case _f .ComponentConn ,_f .ComponentCharacters ,_f .ComponentWords :default:return _b .Error (_fdc ,"\u0069n\u0076\u0061\u006c\u0069d\u0020\u0063\u006c\u0061\u0073s\u0065r\u0020c\u006f\u006d\u0070\u006f\u006e\u0065\u006et");
|
|
|
|
};return nil ;};
|