mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-05 19:30:30 +08:00
111 lines
32 KiB
Go
111 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 (_e "github.com/unidoc/unipdf/v3/common";_g "github.com/unidoc/unipdf/v3/internal/jbig2/basic";_cd "github.com/unidoc/unipdf/v3/internal/jbig2/bitmap";_gd "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_ag "image";_c "math";
|
|
);func (_edd *Classer )classifyRankHaus (_gcc *_cd .Boxes ,_bdd *_cd .Bitmaps ,_efg int )error {const _beg ="\u0063\u006ca\u0073\u0073\u0069f\u0079\u0052\u0061\u006e\u006b\u0048\u0061\u0075\u0073";if _gcc ==nil {return _gd .Error (_beg ,"\u0062\u006fx\u0061\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if _bdd ==nil {return _gd .Error (_beg ,"\u0070\u0069x\u0061\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};_bbda :=len (_bdd .Values );if _bbda ==0{return _gd .Error (_beg ,"e\u006dp\u0074\u0079\u0020\u006e\u0065\u0077\u0020\u0063o\u006d\u0070\u006f\u006een\u0074\u0073");
|
|
};_aee :=_bdd .CountPixels ();_caga :=_edd .Settings .SizeHaus ;_acb :=_cd .SelCreateBrick (_caga ,_caga ,_caga /2,_caga /2,_cd .SelHit );_dfd :=&_cd .Bitmaps {Values :make ([]*_cd .Bitmap ,_bbda )};_fde :=&_cd .Bitmaps {Values :make ([]*_cd .Bitmap ,_bbda )};
|
|
var (_ebbf ,_cdg ,_dgf *_cd .Bitmap ;_gff error ;);for _bgg :=0;_bgg < _bbda ;_bgg ++{_ebbf ,_gff =_bdd .GetBitmap (_bgg );if _gff !=nil {return _gd .Wrap (_gff ,_beg ,"");};_cdg ,_gff =_ebbf .AddBorderGeneral (JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,0);
|
|
if _gff !=nil {return _gd .Wrap (_gff ,_beg ,"");};_dgf ,_gff =_cd .Dilate (nil ,_cdg ,_acb );if _gff !=nil {return _gd .Wrap (_gff ,_beg ,"");};_dfd .Values [_bbda ]=_cdg ;_fde .Values [_bbda ]=_dgf ;};_eec ,_gff :=_cd .Centroids (_dfd .Values );if _gff !=nil {return _gd .Wrap (_gff ,_beg ,"");
|
|
};if _gff =_eec .Add (_edd .CentroidPoints );_gff !=nil {_e .Log .Trace ("\u004e\u006f\u0020\u0063en\u0074\u0072\u006f\u0069\u0064\u0073\u0020\u0074\u006f\u0020\u0061\u0064\u0064");};if _edd .Settings .RankHaus ==1.0{_gff =_edd .classifyRankHouseOne (_gcc ,_bdd ,_dfd ,_fde ,_eec ,_efg );
|
|
}else {_gff =_edd .classifyRankHouseNonOne (_gcc ,_bdd ,_dfd ,_fde ,_eec ,_aee ,_efg );};if _gff !=nil {return _gd .Wrap (_gff ,_beg ,"");};return nil ;};type Classer struct{BaseIndex int ;Settings Settings ;ComponentsNumber *_g .IntSlice ;TemplateAreas *_g .IntSlice ;
|
|
Widths map[int ]int ;Heights map[int ]int ;NumberOfClasses int ;ClassInstances *_cd .BitmapsArray ;UndilatedTemplates *_cd .Bitmaps ;DilatedTemplates *_cd .Bitmaps ;TemplatesSize _g .IntsMap ;FgTemplates *_g .NumSlice ;CentroidPoints *_cd .Points ;CentroidPointsTemplates *_cd .Points ;
|
|
ClassIDs *_g .IntSlice ;ComponentPageNumbers *_g .IntSlice ;PtaUL *_cd .Points ;PtaLL *_cd .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};func Init (settings Settings )(*Classer ,error ){const _ad ="\u0063\u006c\u0061s\u0073\u0065\u0072\u002e\u0049\u006e\u0069\u0074";
|
|
_eb :=&Classer {Settings :settings ,Widths :map[int ]int {},Heights :map[int ]int {},TemplatesSize :_g .IntsMap {},TemplateAreas :&_g .IntSlice {},ComponentPageNumbers :&_g .IntSlice {},ClassIDs :&_g .IntSlice {},ComponentsNumber :&_g .IntSlice {},CentroidPoints :&_cd .Points {},CentroidPointsTemplates :&_cd .Points {},UndilatedTemplates :&_cd .Bitmaps {},DilatedTemplates :&_cd .Bitmaps {},ClassInstances :&_cd .BitmapsArray {},FgTemplates :&_g .NumSlice {}};
|
|
if _f :=_eb .Settings .Validate ();_f !=nil {return nil ,_gd .Wrap (_f ,_ad ,"");};return _eb ,nil ;};func (_fg *Classer )classifyCorrelation (_gfe *_cd .Boxes ,_faf *_cd .Bitmaps ,_ege int )error {const _ecg ="\u0063\u006c\u0061\u0073si\u0066\u0079\u0043\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e";
|
|
if _gfe ==nil {return _gd .Error (_ecg ,"\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 _faf ==nil {return _gd .Error (_ecg ,"\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");};_ecac :=len (_faf .Values );if _ecac ==0{_e .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 (_dg ,_fdg *_cd .Bitmap ;_adcf error ;);_bdb :=&_cd .Bitmaps {Values :make ([]*_cd .Bitmap ,_ecac )};for _bbdb ,_cf :=range _faf .Values {_fdg ,_adcf =_cf .AddBorderGeneral (JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,JbAddedPixels ,0);
|
|
if _adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"");};_bdb .Values [_bbdb ]=_fdg ;};_ac :=_fg .FgTemplates ;_cga :=_cd .MakePixelSumTab8 ();_bfe :=_cd .MakePixelCentroidTab8 ();_eae :=make ([]int ,_ecac );_cdc :=make ([][]int ,_ecac );_ggc :=_cd .Points (make ([]_cd .Point ,_ecac ));
|
|
_df :=&_ggc ;var (_dd ,_dac int ;_ccf ,_ada ,_eee int ;_dcf ,_cafc int ;_cac byte ;);for _afc ,_ddd :=range _bdb .Values {_cdc [_afc ]=make ([]int ,_ddd .Height );_dd =0;_dac =0;_ada =(_ddd .Height -1)*_ddd .RowStride ;_ccf =0;for _cafc =_ddd .Height -1;
|
|
_cafc >=0;_cafc ,_ada =_cafc -1,_ada -_ddd .RowStride {_cdc [_afc ][_cafc ]=_ccf ;_eee =0;for _dcf =0;_dcf < _ddd .RowStride ;_dcf ++{_cac =_ddd .Data [_ada +_dcf ];_eee +=_cga [_cac ];_dd +=_bfe [_cac ]+_dcf *8*_cga [_cac ];};_ccf +=_eee ;_dac +=_eee *_cafc ;
|
|
};_eae [_afc ]=_ccf ;if _ccf > 0{(*_df )[_afc ]=_cd .Point {X :float32 (_dd )/float32 (_ccf ),Y :float32 (_dac )/float32 (_ccf )};}else {(*_df )[_afc ]=_cd .Point {X :float32 (_ddd .Width )/float32 (2),Y :float32 (_ddd .Height )/float32 (2)};};};if _adcf =_fg .CentroidPoints .Add (_df );
|
|
_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0063\u0065\u006et\u0072\u006f\u0069\u0064\u0020\u0061\u0064\u0064");};var (_de ,_ce ,_db int ;_afb float64 ;_bcc ,_ge ,_ccc ,_dag float32 ;_bfd ,_eeg _cd .Point ;_efc bool ;_cff *similarTemplatesFinder ;_dfe int ;
|
|
_cad *_cd .Bitmap ;_ebb *_ag .Rectangle ;_eeb *_cd .Bitmaps ;);for _dfe ,_fdg =range _bdb .Values {_ce =_eae [_dfe ];if _bcc ,_ge ,_adcf =_df .GetGeometry (_dfe );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0070t\u0061\u0020\u002d\u0020\u0069");};_efc =false ;
|
|
_dfa :=len (_fg .UndilatedTemplates .Values );_cff =_cbe (_fg ,_fdg );for _cag :=_cff .Next ();_cag > -1;{if _cad ,_adcf =_fg .UndilatedTemplates .GetBitmap (_cag );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0075\u006e\u0069dl\u0061\u0074\u0065\u0064\u005b\u0069\u0063\u006c\u0061\u0073\u0073\u005d\u0020\u003d\u0020\u0062\u006d\u0032");
|
|
};if _db ,_adcf =_ac .GetInt (_cag );_adcf !=nil {_e .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",_adcf );};if _ccc ,_dag ,_adcf =_fg .CentroidPointsTemplates .GetGeometry (_cag );
|
|
_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\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 _fg .Settings .WeightFactor > 0.0{if _de ,_adcf =_fg .TemplateAreas .Get (_cag );_adcf !=nil {_e .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",_adcf );
|
|
};_afb =_fg .Settings .Thresh +(1.0-_fg .Settings .Thresh )*_fg .Settings .WeightFactor *float64 (_db )/float64 (_de );}else {_afb =_fg .Settings .Thresh ;};_fcb ,_fad :=_cd .CorrelationScoreThresholded (_fdg ,_cad ,_ce ,_db ,_bfd .X -_eeg .X ,_bfd .Y -_eeg .Y ,MaxDiffWidth ,MaxDiffHeight ,_cga ,_cdc [_dfe ],float32 (_afb ));
|
|
if _fad !=nil {return _gd .Wrap (_fad ,_ecg ,"");};if _ggb {var (_bff ,_gbe float64 ;_fbd ,_ebf int ;);_bff ,_fad =_cd .CorrelationScore (_fdg ,_cad ,_ce ,_db ,_bcc -_ccc ,_ge -_dag ,MaxDiffWidth ,MaxDiffHeight ,_cga );if _fad !=nil {return _gd .Wrap (_fad ,_ecg ,"d\u0065\u0062\u0075\u0067Co\u0072r\u0065\u006c\u0061\u0074\u0069o\u006e\u0053\u0063\u006f\u0072\u0065");
|
|
};_gbe ,_fad =_cd .CorrelationScoreSimple (_fdg ,_cad ,_ce ,_db ,_bcc -_ccc ,_ge -_dag ,MaxDiffWidth ,MaxDiffHeight ,_cga );if _fad !=nil {return _gd .Wrap (_fad ,_ecg ,"d\u0065\u0062\u0075\u0067Co\u0072r\u0065\u006c\u0061\u0074\u0069o\u006e\u0053\u0063\u006f\u0072\u0065");
|
|
};_fbd =int (_c .Sqrt (_bff *float64 (_ce )*float64 (_db )));_ebf =int (_c .Sqrt (_gbe *float64 (_ce )*float64 (_db )));if (_bff >=_afb )!=(_gbe >=_afb ){return _gd .Errorf (_ecg ,"\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",_fbd ,_bff ,_bff >=_afb ,_ebf ,_gbe ,_gbe >=_afb ,_bff -_gbe );
|
|
};if _bff >=_afb !=_fcb {return _gd .Errorf (_ecg ,"\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",_bff ,_bff *float64 (_ce )*float64 (_db ),_fbd ,_afb ,float32 (_afb )*float32 (_ce )*float32 (_db ),_fcb );
|
|
};};if _fcb {_efc =true ;if _fad =_fg .ClassIDs .Add (_cag );_fad !=nil {return _gd .Wrap (_fad ,_ecg ,"\u006f\u0076\u0065\u0072\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006c\u0064");};if _fad =_fg .ComponentPageNumbers .Add (_ege );_fad !=nil {return _gd .Wrap (_fad ,_ecg ,"\u006f\u0076\u0065\u0072\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006c\u0064");
|
|
};if _fg .Settings .KeepClassInstances {if _dg ,_fad =_faf .GetBitmap (_dfe );_fad !=nil {return _gd .Wrap (_fad ,_ecg ,"\u004b\u0065\u0065\u0070Cl\u0061\u0073\u0073\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065\u0073\u0020\u002d \u0069");};if _eeb ,_fad =_fg .ClassInstances .GetBitmaps (_cag );
|
|
_fad !=nil {return _gd .Wrap (_fad ,_ecg ,"K\u0065\u0065\u0070\u0043\u006c\u0061s\u0073\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065s\u0020\u002d\u0020i\u0043l\u0061\u0073\u0073");};_eeb .AddBitmap (_dg );if _ebb ,_fad =_gfe .Get (_dfe );_fad !=nil {return _gd .Wrap (_fad ,_ecg ,"\u004be\u0065p\u0043\u006c\u0061\u0073\u0073I\u006e\u0073t\u0061\u006e\u0063\u0065\u0073");
|
|
};_eeb .AddBox (_ebb );};break ;};};if !_efc {if _adcf =_fg .ClassIDs .Add (_dfa );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0021\u0066\u006f\u0075\u006e\u0064");};if _adcf =_fg .ComponentPageNumbers .Add (_ege );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
};_eeb =&_cd .Bitmaps {};if _dg ,_adcf =_faf .GetBitmap (_dfe );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_eeb .AddBitmap (_dg );_cafb ,_agf :=_dg .Width ,_dg .Height ;_cde :=uint64 (_agf )*uint64 (_cafb );_fg .TemplatesSize .Add (_cde ,_dfa );
|
|
if _ebb ,_adcf =_gfe .Get (_dfe );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_eeb .AddBox (_ebb );_fg .ClassInstances .AddBitmaps (_eeb );_fg .CentroidPointsTemplates .AddPoint (_bcc ,_ge );_fg .FgTemplates .AddInt (_ce );
|
|
_fg .UndilatedTemplates .AddBitmap (_dg );_de =(_fdg .Width -2*JbAddedPixels )*(_fdg .Height -2*JbAddedPixels );if _adcf =_fg .TemplateAreas .Add (_de );_adcf !=nil {return _gd .Wrap (_adcf ,_ecg ,"\u0021\u0066\u006f\u0075\u006e\u0064");};};};_fg .NumberOfClasses =len (_fg .UndilatedTemplates .Values );
|
|
return nil ;};func _cbe (_aag *Classer ,_bea *_cd .Bitmap )*similarTemplatesFinder {return &similarTemplatesFinder {Width :_bea .Width ,Height :_bea .Height ,Classer :_aag };};type Method int ;const (RankHaus Method =iota ;Correlation ;);func (_deae Settings )Validate ()error {const _eebc ="\u0053\u0065\u0074\u0074\u0069\u006e\u0067\u0073\u002e\u0056\u0061\u006ci\u0064\u0061\u0074\u0065";
|
|
if _deae .Thresh < 0.4||_deae .Thresh > 0.98{return _gd .Error (_eebc ,"\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 _deae .WeightFactor < 0.0||_deae .WeightFactor > 1.0{return _gd .Error (_eebc ,"\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 _deae .RankHaus < 0.5||_deae .RankHaus > 1.0{return _gd .Error (_eebc ,"\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 _deae .SizeHaus < 1||_deae .SizeHaus > 10{return _gd .Error (_eebc ,"\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 _deae .Components {case _cd .ComponentConn ,_cd .ComponentCharacters ,_cd .ComponentWords :default:return _gd .Error (_eebc ,"\u0069n\u0076\u0061\u006c\u0069d\u0020\u0063\u006c\u0061\u0073s\u0065r\u0020c\u006f\u006d\u0070\u006f\u006e\u0065\u006et");
|
|
};return nil ;};const (MaxConnCompWidth =350;MaxCharCompWidth =350;MaxWordCompWidth =1000;MaxCompHeight =120;);func (_cda *Classer )AddPage (inputPage *_cd .Bitmap ,pageNumber int ,method Method )(_gf error ){const _ec ="\u0043l\u0061s\u0073\u0065\u0072\u002e\u0041\u0064\u0064\u0050\u0061\u0067\u0065";
|
|
_cda .Widths [pageNumber ]=inputPage .Width ;_cda .Heights [pageNumber ]=inputPage .Height ;if _gf =_cda .verifyMethod (method );_gf !=nil {return _gd .Wrap (_gf ,_ec ,"");};_b ,_bb ,_gf :=inputPage .GetComponents (_cda .Settings .Components ,_cda .Settings .MaxCompWidth ,_cda .Settings .MaxCompHeight );
|
|
if _gf !=nil {return _gd .Wrap (_gf ,_ec ,"");};_e .Log .Debug ("\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074s\u003a\u0020\u0025\u0076",_b );if _gf =_cda .addPageComponents (inputPage ,_bb ,_b ,pageNumber ,method );_gf !=nil {return _gd .Wrap (_gf ,_ec ,"");
|
|
};return nil ;};func (_ggd *Classer )classifyRankHouseOne (_egc *_cd .Boxes ,_gfb ,_fab ,_cca *_cd .Bitmaps ,_ged *_cd .Points ,_fcd int )(_dea error ){const _afbf ="\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 (_fba ,_ffdf ,_dge ,_aed float32 ;_cadd int ;_cccg ,_afd ,_egca ,_bdg ,_ba *_cd .Bitmap ;_aebe ,_daf bool ;);for _dbd :=0;_dbd < len (_gfb .Values );_dbd ++{_afd =_fab .Values [_dbd ];_egca =_cca .Values [_dbd ];_fba ,_ffdf ,_dea =_ged .GetGeometry (_dbd );
|
|
if _dea !=nil {return _gd .Wrapf (_dea ,_afbf ,"\u0066\u0069\u0072\u0073\u0074\u0020\u0067\u0065\u006fm\u0065\u0074\u0072\u0079");};_ggcf :=len (_ggd .UndilatedTemplates .Values );_aebe =false ;_ccab :=_cbe (_ggd ,_afd );for _cadd =_ccab .Next ();_cadd > -1;
|
|
{_bdg ,_dea =_ggd .UndilatedTemplates .GetBitmap (_cadd );if _dea !=nil {return _gd .Wrap (_dea ,_afbf ,"\u0062\u006d\u0033");};_ba ,_dea =_ggd .DilatedTemplates .GetBitmap (_cadd );if _dea !=nil {return _gd .Wrap (_dea ,_afbf ,"\u0062\u006d\u0034");};
|
|
_dge ,_aed ,_dea =_ggd .CentroidPointsTemplates .GetGeometry (_cadd );if _dea !=nil {return _gd .Wrap (_dea ,_afbf ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0054\u0065\u006d\u0070l\u0061\u0074\u0065\u0073");};_daf ,_dea =_cd .HausTest (_afd ,_egca ,_bdg ,_ba ,_fba -_dge ,_ffdf -_aed ,MaxDiffWidth ,MaxDiffHeight );
|
|
if _dea !=nil {return _gd .Wrap (_dea ,_afbf ,"");};if _daf {_aebe =true ;if _dea =_ggd .ClassIDs .Add (_cadd );_dea !=nil {return _gd .Wrap (_dea ,_afbf ,"");};if _dea =_ggd .ComponentPageNumbers .Add (_fcd );_dea !=nil {return _gd .Wrap (_dea ,_afbf ,"");
|
|
};if _ggd .Settings .KeepClassInstances {_dec ,_aa :=_ggd .ClassInstances .GetBitmaps (_cadd );if _aa !=nil {return _gd .Wrap (_aa ,_afbf ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");};_cccg ,_aa =_gfb .GetBitmap (_dbd );if _aa !=nil {return _gd .Wrap (_aa ,_afbf ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");
|
|
};_dec .AddBitmap (_cccg );_dcd ,_aa :=_egc .Get (_dbd );if _aa !=nil {return _gd .Wrap (_aa ,_afbf ,"\u004be\u0065\u0070\u0050\u0069\u0078\u0061a");};_dec .AddBox (_dcd );};break ;};};if !_aebe {if _dea =_ggd .ClassIDs .Add (_ggcf );_dea !=nil {return _gd .Wrap (_dea ,_afbf ,"");
|
|
};if _dea =_ggd .ComponentPageNumbers .Add (_fcd );_dea !=nil {return _gd .Wrap (_dea ,_afbf ,"");};_caa :=&_cd .Bitmaps {};_cccg ,_dea =_gfb .GetBitmap (_dbd );if _dea !=nil {return _gd .Wrap (_dea ,_afbf ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_caa .Values =append (_caa .Values ,_cccg );
|
|
_bee ,_baa :=_cccg .Width ,_cccg .Height ;_ggd .TemplatesSize .Add (uint64 (_baa )*uint64 (_bee ),_ggcf );_gga ,_abc :=_egc .Get (_dbd );if _abc !=nil {return _gd .Wrap (_abc ,_afbf ,"\u0021\u0066\u006f\u0075\u006e\u0064");};_caa .AddBox (_gga );_ggd .ClassInstances .AddBitmaps (_caa );
|
|
_ggd .CentroidPointsTemplates .AddPoint (_fba ,_ffdf );_ggd .UndilatedTemplates .AddBitmap (_afd );_ggd .DilatedTemplates .AddBitmap (_egca );};};return nil ;};func (_ee *Classer )getULCorners (_agg *_cd .Bitmap ,_bc *_cd .Boxes )error {const _bbd ="\u0067\u0065\u0074U\u004c\u0043\u006f\u0072\u006e\u0065\u0072\u0073";
|
|
if _agg ==nil {return _gd .Error (_bbd ,"\u006e\u0069l\u0020\u0069\u006da\u0067\u0065\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bc ==nil {return _gd .Error (_bbd ,"\u006e\u0069\u006c\u0020\u0062\u006f\u0075\u006e\u0064\u0073");};if _ee .PtaUL ==nil {_ee .PtaUL =&_cd .Points {};
|
|
};_gg :=len (*_bc );var (_gde ,_fb ,_cdf ,_be int ;_eca ,_gb ,_fc ,_cdb float32 ;_cdba error ;_fbc *_ag .Rectangle ;_fcg *_cd .Bitmap ;_gdb _ag .Point ;);for _eg :=0;_eg < _gg ;_eg ++{_gde =_ee .BaseIndex +_eg ;if _eca ,_gb ,_cdba =_ee .CentroidPoints .GetGeometry (_gde );
|
|
_cdba !=nil {return _gd .Wrap (_cdba ,_bbd ,"\u0043\u0065\u006e\u0074\u0072\u006f\u0069\u0064\u0050o\u0069\u006e\u0074\u0073");};if _fb ,_cdba =_ee .ClassIDs .Get (_gde );_cdba !=nil {return _gd .Wrap (_cdba ,_bbd ,"\u0043\u006c\u0061s\u0073\u0049\u0044\u0073\u002e\u0047\u0065\u0074");
|
|
};if _fc ,_cdb ,_cdba =_ee .CentroidPointsTemplates .GetGeometry (_fb );_cdba !=nil {return _gd .Wrap (_cdba ,_bbd ,"\u0043\u0065\u006etr\u006f\u0069\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073");};_cg :=_fc -_eca ;
|
|
_bef :=_cdb -_gb ;if _cg >=0{_cdf =int (_cg +0.5);}else {_cdf =int (_cg -0.5);};if _bef >=0{_be =int (_bef +0.5);}else {_be =int (_bef -0.5);};if _fbc ,_cdba =_bc .Get (_eg );_cdba !=nil {return _gd .Wrap (_cdba ,_bbd ,"");};_bd ,_fcf :=_fbc .Min .X ,_fbc .Min .Y ;
|
|
_fcg ,_cdba =_ee .UndilatedTemplates .GetBitmap (_fb );if _cdba !=nil {return _gd .Wrap (_cdba ,_bbd ,"\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");
|
|
};_gdb ,_cdba =_bf (_agg ,_bd ,_fcf ,_cdf ,_be ,_fcg );if _cdba !=nil {return _gd .Wrap (_cdba ,_bbd ,"");};_ee .PtaUL .AddPoint (float32 (_bd -_cdf +_gdb .X ),float32 (_fcf -_be +_gdb .Y ));};return nil ;};func (_ea *Classer )ComputeLLCorners ()(_ae error ){const _aeb ="\u0043l\u0061\u0073\u0073\u0065\u0072\u002e\u0043\u006f\u006d\u0070\u0075t\u0065\u004c\u004c\u0043\u006f\u0072\u006e\u0065\u0072\u0073";
|
|
if _ea .PtaUL ==nil {return _gd .Error (_aeb ,"\u0055\u004c\u0020\u0043or\u006e\u0065\u0072\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};_ga :=len (*_ea .PtaUL );_ea .PtaLL =&_cd .Points {};var (_cb ,_ed float32 ;_d ,_agc int ;
|
|
_fe *_cd .Bitmap ;);for _dc :=0;_dc < _ga ;_dc ++{_cb ,_ed ,_ae =_ea .PtaUL .GetGeometry (_dc );if _ae !=nil {_e .Log .Debug ("\u0047e\u0074\u0074\u0069\u006e\u0067\u0020\u0050\u0074\u0061\u0055\u004c \u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_ae );
|
|
return _gd .Wrap (_ae ,_aeb ,"\u0050\u0074\u0061\u0055\u004c\u0020\u0047\u0065\u006fm\u0065\u0074\u0072\u0079");};_d ,_ae =_ea .ClassIDs .Get (_dc );if _ae !=nil {_e .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",_ae );
|
|
return _gd .Wrap (_ae ,_aeb ,"\u0043l\u0061\u0073\u0073\u0049\u0044");};_fe ,_ae =_ea .UndilatedTemplates .GetBitmap (_d );if _ae !=nil {_e .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",_ae );
|
|
return _gd .Wrap (_ae ,_aeb ,"\u0055\u006e\u0064\u0069la\u0074\u0065\u0064\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065\u0073");};_agc =_fe .Height ;_ea .PtaLL .AddPoint (_cb ,_ed +float32 (_agc ));};return nil ;};func (_af *Classer )verifyMethod (_ffd Method )error {if _ffd !=RankHaus &&_ffd !=Correlation {return _gd .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 ;};func DefaultSettings ()Settings {_befa :=&Settings {};_befa .SetDefault ();return *_befa };func (_ef *Classer )addPageComponents (_ff *_cd .Bitmap ,_fee *_cd .Boxes ,_da *_cd .Bitmaps ,_ab int ,_gag Method )error {const _ecf ="\u0043l\u0061\u0073\u0073\u0065r\u002e\u0041\u0064\u0064\u0050a\u0067e\u0043o\u006d\u0070\u006f\u006e\u0065\u006e\u0074s";
|
|
if _ff ==nil {return _gd .Error (_ecf ,"\u006e\u0069\u006c\u0020\u0069\u006e\u0070\u0075\u0074 \u0070\u0061\u0067\u0065");};if _fee ==nil ||_da ==nil ||len (*_fee )==0{_e .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",_ff );
|
|
return nil ;};var _eaa error ;switch _gag {case RankHaus :_eaa =_ef .classifyRankHaus (_fee ,_da ,_ab );case Correlation :_eaa =_ef .classifyCorrelation (_fee ,_da ,_ab );default:_e .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",_gag );
|
|
return _gd .Error (_ecf ,"\u0075\u006e\u006bno\u0077\u006e\u0020\u0063\u006c\u0061\u0073\u0073\u0069\u0066\u0079\u0020\u006d\u0065\u0074\u0068\u006f\u0064");};if _eaa !=nil {return _gd .Wrap (_eaa ,_ecf ,"");};if _eaa =_ef .getULCorners (_ff ,_fee );_eaa !=nil {return _gd .Wrap (_eaa ,_ecf ,"");
|
|
};_gad :=len (*_fee );_ef .BaseIndex +=_gad ;if _eaa =_ef .ComponentsNumber .Add (_gad );_eaa !=nil {return _gd .Wrap (_eaa ,_ecf ,"");};return nil ;};type Settings struct{MaxCompWidth int ;MaxCompHeight int ;SizeHaus int ;RankHaus float64 ;Thresh float64 ;
|
|
WeightFactor float64 ;KeepClassInstances bool ;Components _cd .Component ;Method Method ;};func _bf (_add *_cd .Bitmap ,_ade ,_afa ,_daa ,_bg int ,_bfc *_cd .Bitmap )(_ca _ag .Point ,_cc error ){const _bga ="\u0066i\u006e\u0061\u006c\u0041l\u0069\u0067\u006e\u006d\u0065n\u0074P\u006fs\u0069\u0074\u0069\u006f\u006e\u0069\u006eg";
|
|
if _add ==nil {return _ca ,_gd .Error (_bga ,"\u0073\u006f\u0075\u0072ce\u0020\u006e\u006f\u0074\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};if _bfc ==nil {return _ca ,_gd .Error (_bga ,"t\u0065\u006d\u0070\u006cat\u0065 \u006e\u006f\u0074\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
};_caf ,_bde :=_bfc .Width ,_bfc .Height ;_gaga ,_fd :=_ade -_daa -JbAddedPixels ,_afa -_bg -JbAddedPixels ;_e .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",_ade ,_afa ,_caf ,_bde ,_gaga ,_fd );
|
|
_fed ,_cc :=_cd .Rect (_gaga ,_fd ,_caf ,_bde );if _cc !=nil {return _ca ,_gd .Wrap (_cc ,_bga ,"");};_fa ,_ ,_cc :=_add .ClipRectangle (_fed );if _cc !=nil {_e .Log .Error ("\u0043a\u006e\u0027\u0074\u0020\u0063\u006c\u0069\u0070\u0020\u0072\u0065c\u0074\u0061\u006e\u0067\u006c\u0065\u003a\u0020\u0025\u0076",_fed );
|
|
return _ca ,_gd .Wrap (_cc ,_bga ,"");};_gc :=_cd .New (_fa .Width ,_fa .Height );_ede :=_c .MaxInt32 ;var _ffa ,_edeg ,_adc ,_gdc ,_gac int ;for _ffa =-1;_ffa <=1;_ffa ++{for _edeg =-1;_edeg <=1;_edeg ++{if _ ,_cc =_cd .Copy (_gc ,_fa );_cc !=nil {return _ca ,_gd .Wrap (_cc ,_bga ,"");
|
|
};if _cc =_gc .RasterOperation (_edeg ,_ffa ,_caf ,_bde ,_cd .PixSrcXorDst ,_bfc ,0,0);_cc !=nil {return _ca ,_gd .Wrap (_cc ,_bga ,"");};_adc =_gc .CountPixels ();if _adc < _ede {_gdc =_edeg ;_gac =_ffa ;_ede =_adc ;};};};_ca .X =_gdc ;_ca .Y =_gac ;return _ca ,nil ;
|
|
};func (_dfdb *Settings )SetDefault (){if _dfdb .MaxCompWidth ==0{switch _dfdb .Components {case _cd .ComponentConn :_dfdb .MaxCompWidth =MaxConnCompWidth ;case _cd .ComponentCharacters :_dfdb .MaxCompWidth =MaxCharCompWidth ;case _cd .ComponentWords :_dfdb .MaxCompWidth =MaxWordCompWidth ;
|
|
};};if _dfdb .MaxCompHeight ==0{_dfdb .MaxCompHeight =MaxCompHeight ;};if _dfdb .Thresh ==0.0{_dfdb .Thresh =0.9;};if _dfdb .WeightFactor ==0.0{_dfdb .WeightFactor =0.75;};if _dfdb .RankHaus ==0.0{_dfdb .RankHaus =0.97;};if _dfdb .SizeHaus ==0{_dfdb .SizeHaus =2;
|
|
};};var _ggb bool ;const (MaxDiffWidth =2;MaxDiffHeight =2;);func (_bca *similarTemplatesFinder )Next ()int {var (_bdbc ,_afe ,_ecc ,_fdge int ;_befad bool ;_dcff *_cd .Bitmap ;_bdea error ;);for {if _bca .Index >=25{return -1;};_afe =_bca .Width +TwoByTwoWalk [2*_bca .Index ];
|
|
_bdbc =_bca .Height +TwoByTwoWalk [2*_bca .Index +1];if _bdbc < 1||_afe < 1{_bca .Index ++;continue ;};if len (_bca .CurrentNumbers )==0{_bca .CurrentNumbers ,_befad =_bca .Classer .TemplatesSize .GetSlice (uint64 (_afe )*uint64 (_bdbc ));if !_befad {_bca .Index ++;
|
|
continue ;};_bca .N =0;};_ecc =len (_bca .CurrentNumbers );for ;_bca .N < _ecc ;_bca .N ++{_fdge =_bca .CurrentNumbers [_bca .N ];_dcff ,_bdea =_bca .Classer .DilatedTemplates .GetBitmap (_fdge );if _bdea !=nil {_e .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 _dcff .Width -2*JbAddedPixels ==_afe &&_dcff .Height -2*JbAddedPixels ==_bdbc {return _fdge ;};};_bca .Index ++;_bca .CurrentNumbers =nil ;};};func (_fcbg *Classer )classifyRankHouseNonOne (_gdg *_cd .Boxes ,_cfd ,_abb ,_gbc *_cd .Bitmaps ,_feb *_cd .Points ,_gfbb *_g .NumSlice ,_bag int )(_deg error ){const _edf ="\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 (_baaa ,_agd ,_efd ,_edg float32 ;_cded ,_ecaa ,_daga int ;_gbb ,_cfe ,_aae ,_ccd ,_cgg *_cd .Bitmap ;_adac ,_gfd bool ;);_fcga :=_cd .MakePixelSumTab8 ();for _ggbb :=0;_ggbb < len (_cfd .Values );_ggbb ++{if _cfe ,_deg =_abb .GetBitmap (_ggbb );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"b\u006d\u0073\u0031\u002e\u0047\u0065\u0074\u0028\u0069\u0029");
|
|
};if _cded ,_deg =_gfbb .GetInt (_ggbb );_deg !=nil {_e .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",_ggbb ,_deg );
|
|
};if _aae ,_deg =_gbc .GetBitmap (_ggbb );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"b\u006d\u0073\u0032\u002e\u0047\u0065\u0074\u0028\u0069\u0029");};if _baaa ,_agd ,_deg =_feb .GetGeometry (_ggbb );_deg !=nil {return _gd .Wrapf (_deg ,_edf ,"\u0070t\u0061[\u0069\u005d\u002e\u0047\u0065\u006f\u006d\u0065\u0074\u0072\u0079");
|
|
};_aeeb :=len (_fcbg .UndilatedTemplates .Values );_adac =false ;_dfb :=_cbe (_fcbg ,_cfe );for _daga =_dfb .Next ();_daga > -1;{if _ccd ,_deg =_fcbg .UndilatedTemplates .GetBitmap (_daga );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"\u0070\u0069\u0078\u0061\u0074\u002e\u005b\u0069\u0043l\u0061\u0073\u0073\u005d");
|
|
};if _ecaa ,_deg =_fcbg .FgTemplates .GetInt (_daga );_deg !=nil {_e .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",_daga ,_deg );
|
|
};if _cgg ,_deg =_fcbg .DilatedTemplates .GetBitmap (_daga );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"\u0070\u0069\u0078\u0061\u0074\u0064\u005b\u0069\u0043l\u0061\u0073\u0073\u005d");};if _efd ,_edg ,_deg =_fcbg .CentroidPointsTemplates .GetGeometry (_daga );
|
|
_deg !=nil {return _gd .Wrap (_deg ,_edf ,"\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");};_gfd ,_deg =_cd .RankHausTest (_cfe ,_aae ,_ccd ,_cgg ,_baaa -_efd ,_agd -_edg ,MaxDiffWidth ,MaxDiffHeight ,_cded ,_ecaa ,float32 (_fcbg .Settings .RankHaus ),_fcga );
|
|
if _deg !=nil {return _gd .Wrap (_deg ,_edf ,"");};if _gfd {_adac =true ;if _deg =_fcbg .ClassIDs .Add (_daga );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"");};if _deg =_fcbg .ComponentPageNumbers .Add (_bag );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"");
|
|
};if _fcbg .Settings .KeepClassInstances {_bcb ,_adeg :=_fcbg .ClassInstances .GetBitmaps (_daga );if _adeg !=nil {return _gd .Wrap (_adeg ,_edf ,"\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 _gbb ,_adeg =_cfd .GetBitmap (_ggbb );_adeg !=nil {return _gd .Wrap (_adeg ,_edf ,"\u0070i\u0078\u0061\u005b\u0069\u005d");};_bcb .Values =append (_bcb .Values ,_gbb );_dgb ,_adeg :=_gdg .Get (_ggbb );if _adeg !=nil {return _gd .Wrap (_adeg ,_edf ,"b\u006f\u0078\u0061\u002e\u0047\u0065\u0074\u0028\u0069\u0029");
|
|
};_bcb .Boxes =append (_bcb .Boxes ,_dgb );};break ;};};if !_adac {if _deg =_fcbg .ClassIDs .Add (_aeeb );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"\u0021\u0066\u006f\u0075\u006e\u0064");};if _deg =_fcbg .ComponentPageNumbers .Add (_bag );_deg !=nil {return _gd .Wrap (_deg ,_edf ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
};_aea :=&_cd .Bitmaps {};_gbb =_cfd .Values [_ggbb ];_aea .AddBitmap (_gbb );_ead ,_gacd :=_gbb .Width ,_gbb .Height ;_fcbg .TemplatesSize .Add (uint64 (_ead )*uint64 (_gacd ),_aeeb );_geb ,_def :=_gdg .Get (_ggbb );if _def !=nil {return _gd .Wrap (_def ,_edf ,"\u0021\u0066\u006f\u0075\u006e\u0064");
|
|
};_aea .AddBox (_geb );_fcbg .ClassInstances .AddBitmaps (_aea );_fcbg .CentroidPointsTemplates .AddPoint (_baaa ,_agd );_fcbg .UndilatedTemplates .AddBitmap (_cfe );_fcbg .DilatedTemplates .AddBitmap (_aae );_fcbg .FgTemplates .AddInt (_cded );};};_fcbg .NumberOfClasses =len (_fcbg .UndilatedTemplates .Values );
|
|
return nil ;};const JbAddedPixels =6;type similarTemplatesFinder struct{Classer *Classer ;Width int ;Height int ;Index int ;CurrentNumbers []int ;N int ;}; |