Development of the ocr part of AOI
Samo Penic
2018-11-18 69abed7feb165280d1ebf8714d71bb25294cbb97
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
3
j|ð[    *ã@sZddlmZddlmZddlZddlZddlZddlZdZ    ej
e e    ƒZ Gdd„dƒZ dS)é)Údecodeé)ÚgetSIDNz /template.pngc@sˆeZdZd#dd„Zd$dd„Zd%d    d
„Zd d „Zd d„Zd&dd„Zdd„Z    dd„Z
d'dd„Z d(dd„Z dd„Z dd„Zdd „Zd!d"„ZdS))ÚPaperNú/tmpcCsd||_||_d|_d|_|dkr(ddin||_g|_g|_d|_||_|dk    r`|j    |ƒ|j
ƒdS)NÚanswer_thresholdgÐ?) ÚfilenameÚ output_pathÚinvalidÚQRDataÚsettingsÚerrorsÚwarningsÚsidÚsid_classifierÚ    loadImageÚrunOcr)Úselfrrr r    ©rú8/home/samo/programiranje/python/sizif-ocr/aoi_ocr/Ocr.pyÚ__init__s
zPaper.__init__rcCsJtj||ƒ|_|jdkr.|jjdƒd|_dS|jjdd…\|_|_dS)NzFile could not be loaded!Tré)    Úcv2ÚimreadÚimgr Úappendr
ÚshapeÚ    imgHeightÚimgWidth)rrZ
rgbchannelrrrrs 
 zPaper.loadImageú/tmp/debug_image.pngcCstj||jƒdS)N)rÚimwriter)rrrrrÚ    saveImage$szPaper.saveImagecCs6|jdkrdS|jƒ|jƒd}|jƒ|jƒdS)NTr)r
ÚdecodeQRandRotateÚ imgTresholdÚgenerateAnswerMatrixr!)rZ    skewAnglerrrr's
z Paper.runOcrcCsÞ|jdkrdStj|jd
ƒ}t|ƒ}||_t|ƒdkrR|jjdƒd|_d|_dSt|ƒdkrŠx*|D]"}|j    dks||j    dkrd||d<PqdW||_
|dj|_ |dj j }|dj j}||jdkrÚ||jdkrÚ|jd    ƒdS) NTérzQR code could not be found!rÚEAN13ZQRg@é´)r%r%)r
rÚblurrrÚlenr rÚdataÚtypeÚQRDecoder ZrectÚleftÚtoprrÚ rotateAngle)rr(ÚdZddZxposZyposrrrr"7s*
 
   zPaper.decodeQRandRotatec    Csdtj|jd|jdf|dƒ}tj|j||j|jftjtjdd}||_|jjdd…\|_|_dS)Nrgð?éÿ)ÚflagsZ
borderModeZ borderValuer)r1r1r1)    rZgetRotationMatrix2DrrZ
warpAffinerZ INTER_CUBICZBORDER_CONSTANTr)rÚangleZrot_matÚresultrrrr/Os
zPaper.rotateAnglecCs&tj|jddtjtjBƒ\|_|_dS)Né€r1)rÚ    thresholdrZ THRESH_BINARYZ THRESH_OTSUZthreshÚbwimg)rrrrr#dszPaper.imgTresholdc     Csàd|j}tjd|ƒd}d}tj|jtjƒ}x|tj|dtjddƒD]b}|d\}}}}    tj    |||f||    fd dƒtj
|    |||ƒ}
|
rFt |
ƒd    krF||
7}|d7}qFWytj ||ƒ} Wnd} YnXtjd
|ƒ| S) Nr1z/tmp/debug_1.pngrgrr'iEré
z/tmp/debug_2.png)rrr1) r7rr ÚcvtColorrÚCOLOR_GRAY2BGRZ HoughLinesPÚnpZpiÚlineZarctan2ÚabsZrad2deg) rÚnegZ angle_counterr3Úcimgr<Zx1Zy1Zx2Zy2Z
this_angleZskewrrrÚ getSkewAngleis&
 
 zPaper.getSkewAngleç333333ë?éÈcCs„tjtdƒ}|jddd    …\}}|jd|…dd…f}tj||tjƒ}tj||kƒ}tj    |tj
ƒ}    g}
g} t |dƒdkr€d
} nîtj |dƒ} xFt |ddd …ŽD]0} | d| dkr¢| j| dƒ|
j| dƒq¢Wt tt |
| ƒƒŽ\}
} tj|
ƒdk}tj|dƒ}tj|
ƒ}
tj| ƒ} | ||
|g}xBt |ddd …ŽD],} tj|    | | d|| d|fd dƒq>Wtjd|    ƒ||_|S)Nrréé(Tr1rz/tmp/debug_3.pngéÿÿÿÿrErErE)rr1r1)rrÚmarkerfilenamerrÚ matchTemplateÚTM_CCOEFF_NORMEDr;Úwherer9r:r)ÚminÚziprÚsortedÚdiffÚarrayÚ    rectangler ÚxMarkerLocations)rr6ZheightÚtemplateÚwÚhÚcrop_imgÚresÚlocr?Úloc_filtered_xÚloc_filtered_yZmin_yÚptÚarrrÚlocateUpMarkers‡s6  
 
, zPaper.locateUpMarkerscCsžtjtdƒ}|jddd    …\}}|jdd…| d…f}tj||tjƒ}tj||kƒ}tj    |tj
ƒ}    g}
g} t |dƒdkr‚d
} nîtj |dƒ} xFt |ddd …ŽD]0}|d| dkr¤| j|dƒ|
j|dƒq¤Wt tt | |
ƒƒŽ\} }
tj| ƒdk}tj|dƒ}tj|
ƒ}
tj| ƒ} | ||
|g}xBt |ddd …ŽD],}tj|    ||d||d|fd dƒq@Wtjd|    ƒ|d|d|j|g|_|jS)NrrrCrDTr1rz/tmp/debug_4.pngrErErErE)rr1r1)rrrFrrrGrHr;rIr9r:r)ÚmaxrKrrLrMrNrOr rÚyMarkerLocations)rr6ÚwidthrQrRrSrTrUrVr?rWrXZmin_xZmax_xrYrZrrrÚlocateRightMarkers¬s6  
 
, zPaper.locateRightMarkersc     Cs¼|jƒ|jƒd}d}d}|}||}g|_xˆ|jdD]z}g}xd|jdD]V}|j|||t||ƒ…|||t||ƒ…f}    |tj|    ƒ}
|j    |
|ƒqNW|jj    |ƒq:WdS)Nr8éé2rr)
r[r_Ú answerMatrixr]rPr7ÚintrZ countNonZeror) rZroixoffZroiyoffZroiwidthZ    roiheightZtotpxÚyZonelineÚxZroiZblackrrrr$Ñs"zPaper.generateAnswerMatrixcsœˆjdkrdSˆjdk    r&ˆjjddƒ}tˆjtdˆjƒtdˆjƒ…tdˆjƒtdˆjƒ…fˆj|ƒ\}}}‡fdd„|Dƒ‡fd    d„|Dƒ|S)
NreÚsid_maskg{®Gáz¤?gR¸…ëQ¸?gffffffæ?g®Gáz®ï?csg|]}ˆjj|ƒ‘qSr)r r)Ú.0Úe)rrrú
<listcomp>õsz*Paper.get_enhanced_sid.<locals>.<listcomp>csg|]}ˆjj|ƒ‘qSr)rr)rgrR)rrrriös)rr Úgetrrrcrr)rrfZesÚerrÚwarnr)rrÚget_enhanced_sidès
 
 zPaper.get_enhanced_sidcCsØ|jdkr*|jjdƒddddddœ}|Stj|jdƒ}|jdjdkr|t|dd…ƒt|dƒdt|dd…ƒdddœS|jd    ƒ}t|dƒt|d
ƒdt|d ƒt|dƒd œ}t    |ƒd krÐ|d |d<|SdS)Nz+Could not read QR or EAN code! Not an exam?)Úexam_idÚpage_noÚpaper_idÚ
faculty_idrÚutf8rr&érr`ú,r%r)rnrorprqéréûÿÿÿrE)
r r rÚbytesrr,r+rcÚsplitr))rZretvalZqrdatar*rrrÚ get_code_dataùs.
 
 
 
  zPaper.get_code_datacCs|jƒ}tj|jdƒ|d<|j|d<|j|d<t|jd|jƒt|j    d|j
ƒf|d<t|jd|jƒt|j    d|j
ƒf|d<t j |j ƒ|jdkdjƒ|d    <|d
dkrÌ|d dkrÌ|jƒ|d
<tjj|jd j|jjd ƒdjd ƒdd…ƒdƒ}tj||jƒ||d<|S)NrrZqrr rrZ up_positionZright_positionrZ
ans_matrixrroÚ.ú/z.pngÚoutput_filenamerErE)ryrwrr r rÚlistrPrr]rr;rNrbr ÚtolistrmÚosÚpathÚjoinr    rrxrr r)rr*r|rrrÚget_paper_ocr_datas
 
" 4zPaper.get_paper_ocr_data)NNNr)r)r)r)rArB)rArB)Ú__name__Ú
__module__Ú __qualname__rrr!rr"r/r#r@r[r_r$rmryr‚rrrrr s
 
 
 
 
%
%!r)Z pyzbar.pyzbarrZ sid_processrrZnumpyr;rÚ pkg_resourcesZ
markerfileÚresource_filenamerƒrFrrrrrÚ<module>s