mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-05 19:30:30 +08:00
110 lines
32 KiB
Go
110 lines
32 KiB
Go
//
|
|
// 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/
|
|
|
|
package classer ;import (_c "github.com/unidoc/unipdf/v3/common";_e "github.com/unidoc/unipdf/v3/internal/jbig2/basic";_fa "github.com/unidoc/unipdf/v3/internal/jbig2/bitmap";_d "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_f "image";_fg "math";
|
|
);type Method int ;func Init (settings Settings )(*Classer ,error ){const _ea ="\u0063\u006c\u0061s\u0073\u0065\u0072\u002e\u0049\u006e\u0069\u0074";_ed :=&Classer {Settings :settings ,Widths :map[int ]int {},Heights :map[int ]int {},TemplatesSize :_e .IntsMap {},TemplateAreas :&_e .IntSlice {},ComponentPageNumbers :&_e .IntSlice {},ClassIDs :&_e .IntSlice {},ComponentsNumber :&_e .IntSlice {},CentroidPoints :&_fa .Points {},CentroidPointsTemplates :&_fa .Points {},UndilatedTemplates :&_fa .Bitmaps {},DilatedTemplates :&_fa .Bitmaps {},ClassInstances :&_fa .BitmapsArray {},FgTemplates :&_e .NumSlice {}};
|
|
if _df :=_ed .Settings .Validate ();_df !=nil {return nil ,_d .Wrap (_df ,_ea ,"");};return _ed ,nil ;};func (_dc *Classer )AddPage (inputPage *_fa .Bitmap ,pageNumber int ,method Method )(_fc error ){const _cb ="\u0043l\u0061s\u0073\u0065\u0072\u002e\u0041\u0064\u0064\u0050\u0061\u0067\u0065";
|
|
_dc .Widths [pageNumber ]=inputPage .Width ;_dc .Heights [pageNumber ]=inputPage .Height ;if _fc =_dc .verifyMethod (method );_fc !=nil {return _d .Wrap (_fc ,_cb ,"");};_ec ,_dce ,_fc :=inputPage .GetComponents (_dc .Settings .Components ,_dc .Settings .MaxCompWidth ,_dc .Settings .MaxCompHeight );
|
|
if _fc !=nil {return _d .Wrap (_fc ,_cb ,"");};_c .Log .Debug ("\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074s\u003a\u0020\u0025\u0076",_ec );if _fc =_dc .addPageComponents (inputPage ,_dce ,_ec ,pageNumber ,method );_fc !=nil {return _d .Wrap (_fc ,_cb ,"");
|
|
};return nil ;};func (_aa *Classer )getULCorners (_fea *_fa .Bitmap ,_bab *_fa .Boxes )error {const _eb ="\u0067\u0065\u0074U\u004c\u0043\u006f\u0072\u006e\u0065\u0072\u0073";if _fea ==nil {return _d .Error (_eb ,"\u006e\u0069l\u0020\u0069\u006da\u0067\u0065\u0020\u0062\u0069\u0074\u006d\u0061\u0070");
|
|
};if _bab ==nil {return _d .Error (_eb ,"\u006e\u0069\u006c\u0020\u0062\u006f\u0075\u006e\u0064\u0073");};if _aa .PtaUL ==nil {_aa .PtaUL =&_fa .Points {};};_gee :=len (*_bab );var (_bb ,_fgf ,_ae ,_cbe int ;_ece ,_fef ,_fd ,_aac float32 ;_fgb error ;_edd *_f .Rectangle ;
|
|
_fadd *_fa .Bitmap ;_aga _f .Point ;);for _ef :=0;_ef < _gee ;_ef ++{_bb =_aa .BaseIndex +_ef ;if _ece ,_fef ,_fgb =_aa .CentroidPoints .GetGeometry (_bb );_fgb !=nil {return _d .Wrap (_fgb ,_eb ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0050o\u0069\u006e\u0074\u0073");
|
|
};if _fgf ,_fgb =_aa .ClassIDs .Get (_bb );_fgb !=nil {return _d .Wrap (_fgb ,_eb ,"\u0043\u006c\u0061s\u0073\u0049\u0044\u0073\u002e\u0047\u0065\u0074");};if _fd ,_aac ,_fgb =_aa .CentroidPointsTemplates .GetGeometry (_fgf );_fgb !=nil {return _d .Wrap (_fgb ,_eb ,"\u0043\u0065\u006etr\u006f\u0069\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073");
|
|
};_bc :=_fd -_ece ;_ce :=_aac -_fef ;if _bc >=0{_ae =int (_bc +0.5);}else {_ae =int (_bc -0.5);};if _ce >=0{_cbe =int (_ce +0.5);}else {_cbe =int (_ce -0.5);};if _edd ,_fgb =_bab .Get (_ef );_fgb !=nil {return _d .Wrap (_fgb ,_eb ,"");};_bd ,_cf :=_edd .Min .X ,_edd .Min .Y ;
|
|
_fadd ,_fgb =_aa .UndilatedTemplates .GetBitmap (_fgf );if _fgb !=nil {return _d .Wrap (_fgb ,_eb ,"\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");
|
|
};_aga ,_fgb =_aaa (_fea ,_bd ,_cf ,_ae ,_cbe ,_fadd );if _fgb !=nil {return _d .Wrap (_fgb ,_eb ,"");};_aa .PtaUL .AddPoint (float32 (_bd -_ae +_aga .X ),float32 (_cf -_cbe +_aga .Y ));};return nil ;};func (_dg *Classer )addPageComponents (_cd *_fa .Bitmap ,_ff *_fa .Boxes ,_gg *_fa .Bitmaps ,_fad int ,_ba Method )error {const _fb ="\u0043l\u0061\u0073\u0073\u0065r\u002e\u0041\u0064\u0064\u0050a\u0067e\u0043o\u006d\u0070\u006f\u006e\u0065\u006e\u0074s";
|
|
if _cd ==nil {return _d .Error (_fb ,"\u006e\u0069\u006c\u0020\u0069\u006e\u0070\u0075\u0074 \u0070\u0061\u0067\u0065");};if _ff ==nil ||_gg ==nil ||len (*_ff )==0{_c .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",_cd );
|
|
return nil ;};var _fe error ;switch _ba {case RankHaus :_fe =_dg .classifyRankHaus (_ff ,_gg ,_fad );case Correlation :_fe =_dg .classifyCorrelation (_ff ,_gg ,_fad );default:_c .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",_ba );
|
|
return _d .Error (_fb ,"\u0075\u006e\u006bno\u0077\u006e\u0020\u0063\u006c\u0061\u0073\u0073\u0069\u0066\u0079\u0020\u006d\u0065\u0074\u0068\u006f\u0064");};if _fe !=nil {return _d .Wrap (_fe ,_fb ,"");};if _fe =_dg .getULCorners (_cd ,_ff );_fe !=nil {return _d .Wrap (_fe ,_fb ,"");
|
|
};_eca :=len (*_ff );_dg .BaseIndex +=_eca ;if _fe =_dg .ComponentsNumber .Add (_eca );_fe !=nil {return _d .Wrap (_fe ,_fb ,"");};return nil ;};func (_fgg Settings )Validate ()error {const _cdgg ="\u0053\u0065\u0074\u0074\u0069\u006e\u0067\u0073\u002e\u0056\u0061\u006ci\u0064\u0061\u0074\u0065";
|
|
if _fgg .Thresh < 0.4||_fgg .Thresh > 0.98{return _d .Error (_cdgg ,"\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 _fgg .WeightFactor < 0.0||_fgg .WeightFactor > 1.0{return _d .Error (_cdgg ,"\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 _fgg .RankHaus < 0.5||_fgg .RankHaus > 1.0{return _d .Error (_cdgg ,"\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 _fgg .SizeHaus < 1||_fgg .SizeHaus > 10{return _d .Error (_cdgg ,"\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 _fgg .Components {case _fa .ComponentConn ,_fa .ComponentCharacters ,_fa .ComponentWords :default:return _d .Error (_cdgg ,"\u0069n\u0076\u0061\u006c\u0069d\u0020\u0063\u006c\u0061\u0073s\u0065r\u0020c\u006f\u006d\u0070\u006f\u006e\u0065\u006et");
|
|
};return nil ;};func (_dfb *similarTemplatesFinder )Next ()int {var (_gagf ,_beg ,_efed ,_gcc int ;_agcg bool ;_baga *_fa .Bitmap ;_bff error ;);for {if _dfb .Index >=25{return -1;};_beg =_dfb .Width +TwoByTwoWalk [2*_dfb .Index ];_gagf =_dfb .Height +TwoByTwoWalk [2*_dfb .Index +1];
|
|
if _gagf < 1||_beg < 1{_dfb .Index ++;continue ;};if len (_dfb .CurrentNumbers )==0{_dfb .CurrentNumbers ,_agcg =_dfb .Classer .TemplatesSize .GetSlice (uint64 (_beg )*uint64 (_gagf ));if !_agcg {_dfb .Index ++;continue ;};_dfb .N =0;};_efed =len (_dfb .CurrentNumbers );
|
|
for ;_dfb .N < _efed ;_dfb .N ++{_gcc =_dfb .CurrentNumbers [_dfb .N ];_baga ,_bff =_dfb .Classer .DilatedTemplates .GetBitmap (_gcc );if _bff !=nil {_c .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 _baga .Width -2*JbAddedPixels ==_beg &&_baga .Height -2*JbAddedPixels ==_gagf {return _gcc ;};};_dfb .Index ++;_dfb .CurrentNumbers =nil ;};};type Classer struct{BaseIndex int ;Settings Settings ;ComponentsNumber *_e .IntSlice ;TemplateAreas *_e .IntSlice ;
|
|
Widths map[int ]int ;Heights map[int ]int ;NumberOfClasses int ;ClassInstances *_fa .BitmapsArray ;UndilatedTemplates *_fa .Bitmaps ;DilatedTemplates *_fa .Bitmaps ;TemplatesSize _e .IntsMap ;FgTemplates *_e .NumSlice ;CentroidPoints *_fa .Points ;CentroidPointsTemplates *_fa .Points ;
|
|
ClassIDs *_e .IntSlice ;ComponentPageNumbers *_e .IntSlice ;PtaUL *_fa .Points ;PtaLL *_fa .Points ;};func (_dcd *Classer )verifyMethod (_af Method )error {if _af !=RankHaus &&_af !=Correlation {return _d .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 ;};const (MaxDiffWidth =2;MaxDiffHeight =2;);func (_eg *Classer )classifyCorrelation (_gfb *_fa .Boxes ,_febe *_fa .Bitmaps ,_bfc int )error {const _eda ="\u0063\u006c\u0061\u0073si\u0066\u0079\u0043\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e";
|
|
if _gfb ==nil {return _d .Error (_eda ,"\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 _febe ==nil {return _d .Error (_eda ,"\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");};_egc :=len (_febe .Values );if _egc ==0{_c .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 (_fgd ,_gdc *_fa .Bitmap ;_edc error ;);_cfb :=&_fa .Bitmaps {Values :make ([]*_fa .Bitmap ,_egc )};for _ee ,_dge :=range _febe .Values {_gdc ,_edc =_dge .AddBorderGeneral (JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,0);
|
|
if _edc !=nil {return _d .Wrap (_edc ,_eda ,"");};_cfb .Values [_ee ]=_gdc ;};_abc :=_eg .FgTemplates ;_feab :=_fa .MakePixelSumTab8 ();_ffa :=_fa .MakePixelCentroidTab8 ();_ggc :=make ([]int ,_egc );_dfd :=make ([][]int ,_egc );_db :=_fa .Points (make ([]_fa .Point ,_egc ));
|
|
_dde :=&_db ;var (_adf ,_fgdf int ;_bcb ,_gaab ,_fdb int ;_fefd ,_abg int ;_efg byte ;);for _ege ,_cba :=range _cfb .Values {_dfd [_ege ]=make ([]int ,_cba .Height );_adf =0;_fgdf =0;_gaab =(_cba .Height -1)*_cba .RowStride ;_bcb =0;for _abg =_cba .Height -1;
|
|
_abg >=0;_abg ,_gaab =_abg -1,_gaab -_cba .RowStride {_dfd [_ege ][_abg ]=_bcb ;_fdb =0;for _fefd =0;_fefd < _cba .RowStride ;_fefd ++{_efg =_cba .Data [_gaab +_fefd ];_fdb +=_feab [_efg ];_adf +=_ffa [_efg ]+_fefd *8*_feab [_efg ];};_bcb +=_fdb ;_fgdf +=_fdb *_abg ;
|
|
};_ggc [_ege ]=_bcb ;if _bcb > 0{(*_dde )[_ege ]=_fa .Point {X :float32 (_adf )/float32 (_bcb ),Y :float32 (_fgdf )/float32 (_bcb )};}else {(*_dde )[_ege ]=_fa .Point {X :float32 (_cba .Width )/float32 (2),Y :float32 (_cba .Height )/float32 (2)};};};if _edc =_eg .CentroidPoints .Add (_dde );
|
|
_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0063\u0065\u006et\u0072\u006f\u0069\u0064\u0020\u0061\u0064\u0064");};var (_ac ,_gae ,_gc int ;_be float64 ;_ddff ,_cfbc ,_bbf ,_bda float32 ;_ade ,_gag _fa .Point ;_dcee bool ;_cbcf *similarTemplatesFinder ;
|
|
_efe int ;_dgb *_fa .Bitmap ;_gdf *_f .Rectangle ;_cg *_fa .Bitmaps ;);for _efe ,_gdc =range _cfb .Values {_gae =_ggc [_efe ];if _ddff ,_cfbc ,_edc =_dde .GetGeometry (_efe );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0070t\u0061\u0020\u002d\u0020\u0069");
|
|
};_dcee =false ;_cgg :=len (_eg .UndilatedTemplates .Values );_cbcf =_ddd (_eg ,_gdc );for _aef :=_cbcf .Next ();_aef > -1;{if _dgb ,_edc =_eg .UndilatedTemplates .GetBitmap (_aef );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0075\u006e\u0069dl\u0061\u0074\u0065\u0064\u005b\u0069\u0063\u006c\u0061\u0073\u0073\u005d\u0020\u003d\u0020\u0062\u006d\u0032");
|
|
};if _gc ,_edc =_abc .GetInt (_aef );_edc !=nil {_c .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",_edc );};if _bbf ,_bda ,_edc =_eg .CentroidPointsTemplates .GetGeometry (_aef );
|
|
_edc !=nil {return _d .Wrap (_edc ,_eda ,"\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 _eg .Settings .WeightFactor > 0.0{if _ac ,_edc =_eg .TemplateAreas .Get (_aef );_edc !=nil {_c .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",_edc );
|
|
};_be =_eg .Settings .Thresh +(1.0-_eg .Settings .Thresh )*_eg .Settings .WeightFactor *float64 (_gc )/float64 (_ac );}else {_be =_eg .Settings .Thresh ;};_cda ,_edcb :=_fa .CorrelationScoreThresholded (_gdc ,_dgb ,_gae ,_gc ,_ade .X -_gag .X ,_ade .Y -_gag .Y ,MaxDiffWidth ,MaxDiffHeight ,_feab ,_dfd [_efe ],float32 (_be ));
|
|
if _edcb !=nil {return _d .Wrap (_edcb ,_eda ,"");};if _feb {var (_ebb ,_ccd float64 ;_eea ,_ddfb int ;);_ebb ,_edcb =_fa .CorrelationScore (_gdc ,_dgb ,_gae ,_gc ,_ddff -_bbf ,_cfbc -_bda ,MaxDiffWidth ,MaxDiffHeight ,_feab );if _edcb !=nil {return _d .Wrap (_edcb ,_eda ,"d\u0065\u0062\u0075\u0067Co\u0072r\u0065\u006c\u0061\u0074\u0069o\u006e\u0053\u0063\u006f\u0072\u0065");
|
|
};_ccd ,_edcb =_fa .CorrelationScoreSimple (_gdc ,_dgb ,_gae ,_gc ,_ddff -_bbf ,_cfbc -_bda ,MaxDiffWidth ,MaxDiffHeight ,_feab );if _edcb !=nil {return _d .Wrap (_edcb ,_eda ,"d\u0065\u0062\u0075\u0067Co\u0072r\u0065\u006c\u0061\u0074\u0069o\u006e\u0053\u0063\u006f\u0072\u0065");
|
|
};_eea =int (_fg .Sqrt (_ebb *float64 (_gae )*float64 (_gc )));_ddfb =int (_fg .Sqrt (_ccd *float64 (_gae )*float64 (_gc )));if (_ebb >=_be )!=(_ccd >=_be ){return _d .Errorf (_eda ,"\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",_eea ,_ebb ,_ebb >=_be ,_ddfb ,_ccd ,_ccd >=_be ,_ebb -_ccd );
|
|
};if _ebb >=_be !=_cda {return _d .Errorf (_eda ,"\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",_ebb ,_ebb *float64 (_gae )*float64 (_gc ),_eea ,_be ,float32 (_be )*float32 (_gae )*float32 (_gc ),_cda );
|
|
};};if _cda {_dcee =true ;if _edcb =_eg .ClassIDs .Add (_aef );_edcb !=nil {return _d .Wrap (_edcb ,_eda ,"\u006f\u0076\u0065\u0072\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006c\u0064");};if _edcb =_eg .ComponentPageNumbers .Add (_bfc );_edcb !=nil {return _d .Wrap (_edcb ,_eda ,"\u006f\u0076\u0065\u0072\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006c\u0064");
|
|
};if _eg .Settings .KeepClassInstances {if _fgd ,_edcb =_febe .GetBitmap (_efe );_edcb !=nil {return _d .Wrap (_edcb ,_eda ,"\u004b\u0065\u0065\u0070Cl\u0061\u0073\u0073\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065\u0073\u0020\u002d \u0069");};if _cg ,_edcb =_eg .ClassInstances .GetBitmaps (_aef );
|
|
_edcb !=nil {return _d .Wrap (_edcb ,_eda ,"K\u0065\u0065\u0070\u0043\u006c\u0061s\u0073\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065s\u0020\u002d\u0020i\u0043l\u0061\u0073\u0073");};_cg .AddBitmap (_fgd );if _gdf ,_edcb =_gfb .Get (_efe );_edcb !=nil {return _d .Wrap (_edcb ,_eda ,"\u004be\u0065p\u0043\u006c\u0061\u0073\u0073I\u006e\u0073t\u0061\u006e\u0063\u0065\u0073");
|
|
};_cg .AddBox (_gdf );};break ;};};if !_dcee {if _edc =_eg .ClassIDs .Add (_cgg );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0021\u0066\u006f\u0075\u006e\u0064");};if _edc =_eg .ComponentPageNumbers .Add (_bfc );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
};_cg =&_fa .Bitmaps {};if _fgd ,_edc =_febe .GetBitmap (_efe );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_cg .AddBitmap (_fgd );_efeb ,_ggcg :=_fgd .Width ,_fgd .Height ;_fgc :=uint64 (_ggcg )*uint64 (_efeb );_eg .TemplatesSize .Add (_fgc ,_cgg );
|
|
if _gdf ,_edc =_gfb .Get (_efe );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_cg .AddBox (_gdf );_eg .ClassInstances .AddBitmaps (_cg );_eg .CentroidPointsTemplates .AddPoint (_ddff ,_cfbc );_eg .FgTemplates .AddInt (_gae );
|
|
_eg .UndilatedTemplates .AddBitmap (_fgd );_ac =(_gdc .Width -2*JbAddedPixels )*(_gdc .Height -2*JbAddedPixels );if _edc =_eg .TemplateAreas .Add (_ac );_edc !=nil {return _d .Wrap (_edc ,_eda ,"\u0021\u0066\u006f\u0075\u006e\u0064");};};};_eg .NumberOfClasses =len (_eg .UndilatedTemplates .Values );
|
|
return nil ;};const (MaxConnCompWidth =350;MaxCharCompWidth =350;MaxWordCompWidth =1000;MaxCompHeight =120;);func DefaultSettings ()Settings {_ccda :=&Settings {};_ccda .SetDefault ();return *_ccda };func _ddd (_cggb *Classer ,_cfbd *_fa .Bitmap )*similarTemplatesFinder {return &similarTemplatesFinder {Width :_cfbd .Width ,Height :_cfbd .Height ,Classer :_cggb };
|
|
};const (RankHaus Method =iota ;Correlation ;);type Settings struct{MaxCompWidth int ;MaxCompHeight int ;SizeHaus int ;RankHaus float64 ;Thresh float64 ;WeightFactor float64 ;KeepClassInstances bool ;Components _fa .Component ;Method Method ;};func (_eead *Classer )classifyRankHouseNonOne (_gaf *_fa .Boxes ,_dbd ,_eeag ,_cbed *_fa .Bitmaps ,_ggd *_fa .Points ,_bcbe *_e .NumSlice ,_gecf int )(_gdd error ){const _cdec ="\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 (_afb ,_cfg ,_dgc ,_bbfb float32 ;_agc ,_gbg ,_bfdd int ;_bge ,_bgac ,_cgf ,_gece ,_feabg *_fa .Bitmap ;_ada ,_aeb bool ;);_dfc :=_fa .MakePixelSumTab8 ();for _dagd :=0;_dagd < len (_dbd .Values );_dagd ++{if _bgac ,_gdd =_eeag .GetBitmap (_dagd );
|
|
_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"b\u006d\u0073\u0031\u002e\u0047\u0065\u0074\u0028\u0069\u0029");};if _agc ,_gdd =_bcbe .GetInt (_dagd );_gdd !=nil {_c .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",_dagd ,_gdd );
|
|
};if _cgf ,_gdd =_cbed .GetBitmap (_dagd );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"b\u006d\u0073\u0032\u002e\u0047\u0065\u0074\u0028\u0069\u0029");};if _afb ,_cfg ,_gdd =_ggd .GetGeometry (_dagd );_gdd !=nil {return _d .Wrapf (_gdd ,_cdec ,"\u0070t\u0061[\u0069\u005d\u002e\u0047\u0065\u006f\u006d\u0065\u0074\u0072\u0079");
|
|
};_bgeg :=len (_eead .UndilatedTemplates .Values );_ada =false ;_eed :=_ddd (_eead ,_bgac );for _bfdd =_eed .Next ();_bfdd > -1;{if _gece ,_gdd =_eead .UndilatedTemplates .GetBitmap (_bfdd );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"\u0070\u0069\u0078\u0061\u0074\u002e\u005b\u0069\u0043l\u0061\u0073\u0073\u005d");
|
|
};if _gbg ,_gdd =_eead .FgTemplates .GetInt (_bfdd );_gdd !=nil {_c .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",_bfdd ,_gdd );
|
|
};if _feabg ,_gdd =_eead .DilatedTemplates .GetBitmap (_bfdd );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"\u0070\u0069\u0078\u0061\u0074\u0064\u005b\u0069\u0043l\u0061\u0073\u0073\u005d");};if _dgc ,_bbfb ,_gdd =_eead .CentroidPointsTemplates .GetGeometry (_bfdd );
|
|
_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"\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");};_aeb ,_gdd =_fa .RankHausTest (_bgac ,_cgf ,_gece ,_feabg ,_afb -_dgc ,_cfg -_bbfb ,MaxDiffWidth ,MaxDiffHeight ,_agc ,_gbg ,float32 (_eead .Settings .RankHaus ),_dfc );
|
|
if _gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"");};if _aeb {_ada =true ;if _gdd =_eead .ClassIDs .Add (_bfdd );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"");};if _gdd =_eead .ComponentPageNumbers .Add (_gecf );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"");
|
|
};if _eead .Settings .KeepClassInstances {_gcg ,_aacb :=_eead .ClassInstances .GetBitmaps (_bfdd );if _aacb !=nil {return _d .Wrap (_aacb ,_cdec ,"\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 _bge ,_aacb =_dbd .GetBitmap (_dagd );_aacb !=nil {return _d .Wrap (_aacb ,_cdec ,"\u0070i\u0078\u0061\u005b\u0069\u005d");};_gcg .Values =append (_gcg .Values ,_bge );_cgc ,_aacb :=_gaf .Get (_dagd );if _aacb !=nil {return _d .Wrap (_aacb ,_cdec ,"b\u006f\u0078\u0061\u002e\u0047\u0065\u0074\u0028\u0069\u0029");
|
|
};_gcg .Boxes =append (_gcg .Boxes ,_cgc );};break ;};};if !_ada {if _gdd =_eead .ClassIDs .Add (_bgeg );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"\u0021\u0066\u006f\u0075\u006e\u0064");};if _gdd =_eead .ComponentPageNumbers .Add (_gecf );_gdd !=nil {return _d .Wrap (_gdd ,_cdec ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
};_cdg :=&_fa .Bitmaps {};_bge =_dbd .Values [_dagd ];_cdg .AddBitmap (_bge );_bea ,_bgef :=_bge .Width ,_bge .Height ;_eead .TemplatesSize .Add (uint64 (_bea )*uint64 (_bgef ),_bgeg );_aab ,_fff :=_gaf .Get (_dagd );if _fff !=nil {return _d .Wrap (_fff ,_cdec ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
};_cdg .AddBox (_aab );_eead .ClassInstances .AddBitmaps (_cdg );_eead .CentroidPointsTemplates .AddPoint (_afb ,_cfg );_eead .UndilatedTemplates .AddBitmap (_bgac );_eead .DilatedTemplates .AddBitmap (_cgf );_eead .FgTemplates .AddInt (_agc );};};_eead .NumberOfClasses =len (_eead .UndilatedTemplates .Values );
|
|
return nil ;};func (_cdf *Classer )classifyRankHouseOne (_aad *_fa .Boxes ,_ggfd ,_dba ,_fbf *_fa .Bitmaps ,_cfd *_fa .Points ,_dfe int )(_bfd error ){const _edcd ="\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 (_dag ,_agd ,_cae ,_dfec float32 ;_de int ;_ceb ,_aaf ,_cdff ,_fde ,_fgfb *_fa .Bitmap ;_fdeg ,_bcd bool ;);for _abd :=0;_abd < len (_ggfd .Values );_abd ++{_aaf =_dba .Values [_abd ];_cdff =_fbf .Values [_abd ];_dag ,_agd ,_bfd =_cfd .GetGeometry (_abd );
|
|
if _bfd !=nil {return _d .Wrapf (_bfd ,_edcd ,"\u0066\u0069\u0072\u0073\u0074\u0020\u0067\u0065\u006fm\u0065\u0074\u0072\u0079");};_faa :=len (_cdf .UndilatedTemplates .Values );_fdeg =false ;_bdg :=_ddd (_cdf ,_aaf );for _de =_bdg .Next ();_de > -1;{_fde ,_bfd =_cdf .UndilatedTemplates .GetBitmap (_de );
|
|
if _bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"\u0062\u006d\u0033");};_fgfb ,_bfd =_cdf .DilatedTemplates .GetBitmap (_de );if _bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"\u0062\u006d\u0034");};_cae ,_dfec ,_bfd =_cdf .CentroidPointsTemplates .GetGeometry (_de );
|
|
if _bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0054\u0065\u006d\u0070l\u0061\u0074\u0065\u0073");};_bcd ,_bfd =_fa .HausTest (_aaf ,_cdff ,_fde ,_fgfb ,_dag -_cae ,_agd -_dfec ,MaxDiffWidth ,MaxDiffHeight );
|
|
if _bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"");};if _bcd {_fdeg =true ;if _bfd =_cdf .ClassIDs .Add (_de );_bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"");};if _bfd =_cdf .ComponentPageNumbers .Add (_dfe );_bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"");
|
|
};if _cdf .Settings .KeepClassInstances {_bagf ,_gac :=_cdf .ClassInstances .GetBitmaps (_de );if _gac !=nil {return _d .Wrap (_gac ,_edcd ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");};_ceb ,_gac =_ggfd .GetBitmap (_abd );if _gac !=nil {return _d .Wrap (_gac ,_edcd ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");
|
|
};_bagf .AddBitmap (_ceb );_eab ,_gac :=_aad .Get (_abd );if _gac !=nil {return _d .Wrap (_gac ,_edcd ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");};_bagf .AddBox (_eab );};break ;};};if !_fdeg {if _bfd =_cdf .ClassIDs .Add (_faa );_bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"");
|
|
};if _bfd =_cdf .ComponentPageNumbers .Add (_dfe );_bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"");};_bgd :=&_fa .Bitmaps {};_ceb ,_bfd =_ggfd .GetBitmap (_abd );if _bfd !=nil {return _d .Wrap (_bfd ,_edcd ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_bgd .Values =append (_bgd .Values ,_ceb );
|
|
_gb ,_dbe :=_ceb .Width ,_ceb .Height ;_cdf .TemplatesSize .Add (uint64 (_dbe )*uint64 (_gb ),_faa );_gca ,_gda :=_aad .Get (_abd );if _gda !=nil {return _d .Wrap (_gda ,_edcd ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_bgd .AddBox (_gca );_cdf .ClassInstances .AddBitmaps (_bgd );
|
|
_cdf .CentroidPointsTemplates .AddPoint (_dag ,_agd );_cdf .UndilatedTemplates .AddBitmap (_aaf );_cdf .DilatedTemplates .AddBitmap (_cdff );};};return nil ;};func (_ca *Classer )classifyRankHaus (_adeb *_fa .Boxes ,_fadg *_fa .Bitmaps ,_cde int )error {const _cad ="\u0063\u006ca\u0073\u0073\u0069f\u0079\u0052\u0061\u006e\u006b\u0048\u0061\u0075\u0073";
|
|
if _adeb ==nil {return _d .Error (_cad ,"\u0062\u006fx\u0061\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _fadg ==nil {return _d .Error (_cad ,"\u0070\u0069x\u0061\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};_acc :=len (_fadg .Values );if _acc ==0{return _d .Error (_cad ,"e\u006dp\u0074\u0079\u0020\u006e\u0065\u0077\u0020\u0063o\u006d\u0070\u006f\u006een\u0074\u0073");};_aea :=_fadg .CountPixels ();_agf :=_ca .Settings .SizeHaus ;_bdf :=_fa .SelCreateBrick (_agf ,_agf ,_agf /2,_agf /2,_fa .SelHit );
|
|
_aacc :=&_fa .Bitmaps {Values :make ([]*_fa .Bitmap ,_acc )};_gdfb :=&_fa .Bitmaps {Values :make ([]*_fa .Bitmap ,_acc )};var (_bbc ,_da ,_fce *_fa .Bitmap ;_bga error ;);for _afg :=0;_afg < _acc ;_afg ++{_bbc ,_bga =_fadg .GetBitmap (_afg );if _bga !=nil {return _d .Wrap (_bga ,_cad ,"");
|
|
};_da ,_bga =_bbc .AddBorderGeneral (JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,0);if _bga !=nil {return _d .Wrap (_bga ,_cad ,"");};_fce ,_bga =_fa .Dilate (nil ,_da ,_bdf );if _bga !=nil {return _d .Wrap (_bga ,_cad ,"");};_aacc .Values [_acc ]=_da ;
|
|
_gdfb .Values [_acc ]=_fce ;};_abf ,_bga :=_fa .Centroids (_aacc .Values );if _bga !=nil {return _d .Wrap (_bga ,_cad ,"");};if _bga =_abf .Add (_ca .CentroidPoints );_bga !=nil {_c .Log .Trace ("\u004e\u006f\u0020\u0063en\u0074\u0072\u006f\u0069\u0064\u0073\u0020\u0074\u006f\u0020\u0061\u0064\u0064");
|
|
};if _ca .Settings .RankHaus ==1.0{_bga =_ca .classifyRankHouseOne (_adeb ,_fadg ,_aacc ,_gdfb ,_abf ,_cde );}else {_bga =_ca .classifyRankHouseNonOne (_adeb ,_fadg ,_aacc ,_gdfb ,_abf ,_aea ,_cde );};if _bga !=nil {return _d .Wrap (_bga ,_cad ,"");};return nil ;
|
|
};var _feb bool ;type similarTemplatesFinder struct{Classer *Classer ;Width int ;Height int ;Index int ;CurrentNumbers []int ;N int ;};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};
|
|
func (_b *Classer )ComputeLLCorners ()(_a error ){const _fcd ="\u0043l\u0061\u0073\u0073\u0065\u0072\u002e\u0043\u006f\u006d\u0070\u0075t\u0065\u004c\u004c\u0043\u006f\u0072\u006e\u0065\u0072\u0073";if _b .PtaUL ==nil {return _d .Error (_fcd ,"\u0055\u004c\u0020\u0043or\u006e\u0065\u0072\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};_eae :=len (*_b .PtaUL );_b .PtaLL =&_fa .Points {};var (_bf ,_ag float32 ;_gf ,_ge int ;_ecf *_fa .Bitmap ;);for _dd :=0;_dd < _eae ;_dd ++{_bf ,_ag ,_a =_b .PtaUL .GetGeometry (_dd );if _a !=nil {_c .Log .Debug ("\u0047e\u0074\u0074\u0069\u006e\u0067\u0020\u0050\u0074\u0061\u0055\u004c \u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_a );
|
|
return _d .Wrap (_a ,_fcd ,"\u0050\u0074\u0061\u0055\u004c\u0020\u0047\u0065\u006fm\u0065\u0074\u0072\u0079");};_gf ,_a =_b .ClassIDs .Get (_dd );if _a !=nil {_c .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",_a );
|
|
return _d .Wrap (_a ,_fcd ,"\u0043l\u0061\u0073\u0073\u0049\u0044");};_ecf ,_a =_b .UndilatedTemplates .GetBitmap (_gf );if _a !=nil {_c .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",_a );
|
|
return _d .Wrap (_a ,_fcd ,"\u0055\u006e\u0064\u0069la\u0074\u0065\u0064\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073");};_ge =_ecf .Height ;_b .PtaLL .AddPoint (_bf ,_ag +float32 (_ge ));};return nil ;};func _aaa (_ggf *_fa .Bitmap ,_bca ,_fec ,_cc ,_fca int ,_bag *_fa .Bitmap )(_ga _f .Point ,_eaf error ){const _dceg ="\u0066i\u006e\u0061\u006c\u0041l\u0069\u0067\u006e\u006d\u0065n\u0074P\u006fs\u0069\u0074\u0069\u006f\u006e\u0069\u006eg";
|
|
if _ggf ==nil {return _ga ,_d .Error (_dceg ,"\u0073\u006f\u0075\u0072ce\u0020\u006e\u006f\u0074\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};if _bag ==nil {return _ga ,_d .Error (_dceg ,"t\u0065\u006d\u0070\u006cat\u0065 \u006e\u006f\u0074\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
};_ddf ,_fab :=_bag .Width ,_bag .Height ;_fbg ,_bg :=_bca -_cc -JbAddedPixels ,_fec -_fca -JbAddedPixels ;_c .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",_bca ,_fec ,_ddf ,_fab ,_fbg ,_bg );
|
|
_eac ,_eaf :=_fa .Rect (_fbg ,_bg ,_ddf ,_fab );if _eaf !=nil {return _ga ,_d .Wrap (_eaf ,_dceg ,"");};_gd ,_ ,_eaf :=_ggf .ClipRectangle (_eac );if _eaf !=nil {_c .Log .Error ("\u0043a\u006e\u0027\u0074\u0020\u0063\u006c\u0069\u0070\u0020\u0072\u0065c\u0074\u0061\u006e\u0067\u006c\u0065\u003a\u0020\u0025\u0076",_eac );
|
|
return _ga ,_d .Wrap (_eaf ,_dceg ,"");};_gec :=_fa .New (_gd .Width ,_gd .Height );_gaa :=_fg .MaxInt32 ;var _ab ,_bfa ,_aag ,_ad ,_cbc int ;for _ab =-1;_ab <=1;_ab ++{for _bfa =-1;_bfa <=1;_bfa ++{if _ ,_eaf =_fa .Copy (_gec ,_gd );_eaf !=nil {return _ga ,_d .Wrap (_eaf ,_dceg ,"");
|
|
};if _eaf =_gec .RasterOperation (_bfa ,_ab ,_ddf ,_fab ,_fa .PixSrcXorDst ,_bag ,0,0);_eaf !=nil {return _ga ,_d .Wrap (_eaf ,_dceg ,"");};_aag =_gec .CountPixels ();if _aag < _gaa {_ad =_bfa ;_cbc =_ab ;_gaa =_aag ;};};};_ga .X =_ad ;_ga .Y =_cbc ;return _ga ,nil ;
|
|
};const JbAddedPixels =6;func (_cfde *Settings )SetDefault (){if _cfde .MaxCompWidth ==0{switch _cfde .Components {case _fa .ComponentConn :_cfde .MaxCompWidth =MaxConnCompWidth ;case _fa .ComponentCharacters :_cfde .MaxCompWidth =MaxCharCompWidth ;case _fa .ComponentWords :_cfde .MaxCompWidth =MaxWordCompWidth ;
|
|
};};if _cfde .MaxCompHeight ==0{_cfde .MaxCompHeight =MaxCompHeight ;};if _cfde .Thresh ==0.0{_cfde .Thresh =0.9;};if _cfde .WeightFactor ==0.0{_cfde .WeightFactor =0.75;};if _cfde .RankHaus ==0.0{_cfde .RankHaus =0.97;};if _cfde .SizeHaus ==0{_cfde .SizeHaus =2;
|
|
};}; |