B
    1º7^_;  ã               @   s*  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl	m
Z
 d dlmZmZ e ¡ Zej ed¡Zej ed¡Zej ed¡Zej ed¡Zej ed¡Zd	d
ddddddddddddgZdZd	Zdd„ Zd)dd„Zdd„ Zdd„ Zd*d!d"„Zd#d$„ Zd%d&„ Z e!d'kr&e e"j#d( ƒ dS )+é    N)Údate)Ú
itemgetterÚ
attrgetterzdata/ID_CARD_KEYWORDS.csvzdata/CITIES.csvzdata/RELIGIONS.csvzdata/MARRIAGE_STATUS.csvzdata/JENIS_KELAMIN.csvé   é   é   é   é
   é   é   é   é   é   é   é   é   é   é	   c             C   s0   | | | }d||dk < d||dk< |  tj¡S )Nr   éÿ   )ÚastypeÚnpÚuint8)ÚimgÚalphaÚbetaZnew_img© r   ú-/home/kywa/Documents/OCR-KTP-Indonesia/ocr.pyÚconvertScale   s    r   c             C   s  t  | t j¡}t  |gdgd dgddg¡}t|ƒ}g }| t|d ƒ¡ x0td|ƒD ]"}| ||d  t|| ƒ ¡ qTW |d }||d 9 }|d }d}x|| |k r²|d7 }qœW |d }	x||	 || krØ|	d8 }	q¾W d|	|  }
| |
 }t| |
|d}|S )	Nr   é   é   éÿÿÿÿg      Y@g       @r   )r   r   )	Úcv2ÚcvtColorÚCOLOR_BGR2GRAYÚcalcHistÚlenÚappendÚfloatÚranger   )ÚimageZclip_hist_percentZgrayÚhistZ	hist_sizeZaccumulatorÚindexÚmaximumZminimum_grayZmaximum_grayr   r   Zauto_resultr   r   r   Ú!automatic_brightness_and_contrast   s(    "
r-   c             C   sp   t  | d¡} t  | t j¡}t| |ƒ}t j|t ddddg¡gdd t  |dd	t j	¡\}}t
j|d
d}||fS )N)i   iô  )i  é–   )i  ió  )i  ió  )i  r.   )r   r   r   )ZptsZcoloré   r   Úind)Úlang)r!   Úresizer"   ÚCOLOR_RGB2GRAYÚreturn_id_numberÚfillPolyr   ÚasarrayÚ	thresholdÚTHRESH_TRUNCÚpytesseractZimage_to_string)r)   Úimg_grayÚ	id_numberÚthZthreshedÚ
result_rawr   r   r   Úocr_rawC   s    	
 r>   c             C   s4   |   d¡}g }x |D ]}| d¡r| |¡ qW |S )NÚ
ú )ÚsplitÚstripr&   )r=   Úresult_listZnew_result_listZ
tmp_resultr   r   r   Ústrip_opZ   s    


rD   úleft-to-rightc                sj   d}d‰ |dks|dkrd}|dks,|dkr0d‰ dd	„ | D ƒ}t tt | |ƒ‡ fd
d„|dŽ \} }| |fS )NFr   zright-to-leftzbottom-to-topTztop-to-bottomr   c             S   s   g | ]}t  |¡‘qS r   )r!   ÚboundingRect)Ú.0Úcr   r   r   ú
<listcomp>n   s    z!sort_contours.<locals>.<listcomp>c                s   | d ˆ  S )Nr   r   )Úb)Úir   r   Ú<lambda>o   ó    zsort_contours.<locals>.<lambda>)ÚkeyÚreverse)ÚzipÚsorted)ÚcntsÚmethodrO   ZboundingBoxesr   )rK   r   Úsort_contoursd   s    $rT   c       0   
   C   sþ  t  t jd¡}t  |t j|¡}t j|t jdddd}t |¡}t 	|¡t 
|¡ }}d|| ||   }| d¡}t  |t j|¡}t  |ddt jt jB ¡d }t  |t j|¡}t  | ¡ t jt j¡\}}	|}
|  ¡ }t  ||
ddd	¡ |  ¡ }g }xxt|
ƒD ]l\}}t  |¡\}}}}|d
krü|dkrü|dk rüt  |||f|| || fdd¡}| |||||| f¡ qüW t|tdƒdd}d}yd| |d d d |d d |d d	  d …|d d d |d d |d d  d …f }d}W n, tk
r } zt|ƒ W d d }~X Y nX |dkröt  d¡}t  |t j¡}t  |ddt j ¡d }t  | ¡ t jt j¡\}}	t!|ddd }i }xXt|ƒD ]L\}}t  |¡\}}}}|||| …||| …f }t  "|d¡}|||< q„W t  |t j¡}t  |ddt j ¡d }t  | ¡ t jt j¡\}} | ¡ }!t  |!|ddd	¡ |d d }"|d d }#|d d }$|d d	 }%t!|ddd }&g }'xpt|&ƒD ]d\}}t  |¡\}}}}|d
krz|d
krzt  |!||f|| || fdd¡}|' ||||f¡ qzW g }(g })xž|'D ]–}|\}}}}|||| …||| …f }t  "|d¡}g }*xB| #¡ D ]6\}+},t  $||,t j%¡}-t  &|-¡\}.}/}.}.|* |/¡ q6W |) t't (|*¡ƒ¡ qðW t  | |"d |#d f|"|$ d |#|% d fdd¡ t  )| d *|)¡|"|#d ft j+ddd¡ |( ,|)¡ d *|(¡S dS d S )N)r   r   r   r   r    )ZddepthÚdxÚdyZksizer   r   )r   r   r   r   r	   éd   i,  )r   r   r   é   F)rN   rO   r   Tzdata/module2.pngéB   zleft-to-right)rS   )é9   éX   r/   é   Ú )-r!   ÚgetStructuringElementÚ
MORPH_RECTÚmorphologyExÚMORPH_TOPHATÚSobelÚCV_32Fr   ÚabsoluteÚminÚmaxr   ÚMORPH_CLOSEr7   ÚTHRESH_BINARYÚTHRESH_OTSUÚfindContoursÚcopyÚRETR_EXTERNALÚCHAIN_APPROX_SIMPLEÚdrawContoursÚ	enumeraterF   Ú	rectangler&   rQ   r   Ú	ExceptionÚprintÚimreadr"   r#   ÚTHRESH_BINARY_INVrT   r2   ÚitemsÚmatchTemplateÚ	TM_CCOEFFÚ	minMaxLocÚstrÚargmaxÚputTextÚjoinÚFONT_HERSHEY_SIMPLEXÚextend)0r)   r:   Z
rectKernelZtophatZgradXÚminValÚmaxValZthreshZ
threshCntsZ	hierarchyrR   Zcur_imgrk   ÚlocsrK   rH   ÚxÚyÚwÚhr   Z	check_nikÚnikÚeZimg_modÚrefZrefCntsÚdigitsÚroiZgray_nikÚgroupZ	digitCntsZhierarchy_nikZnik_rZgXZgYZgWZgHÚctxZlocs_xÚoutputZgroupOutputZscoresZdigitZdigitROIÚresultÚ_Úscorer   r   r   r4   s   s’    

"\

"
2&

r4   c                s   t jtd d}t jtd d}t jtd d}t jtd d}t jtd d}t| ƒ\}}t|ƒ}d}	d}
d}d}t	ƒ }xtt
|ƒD ]h\}}x^t
| d¡ƒD ]L\}‰ ‡ fdd„|d jD ƒ}t |¡}t |¡}|| dkr’||||f< q’W qzW g }d}xt
|ƒD ]ú\}}g }x¶t
| d¡ƒD ]¤\}‰ ˆ  d	¡‰ ||f|kr”d
}|||f tkrZ| |¡ g }| |d j|||f  ¡ |||f tkr¸| d	¡ n$ˆ d	ksˆ dkr®qn
| ˆ ¡ qW |rút|ƒdkrêd	|krê|d  |¡ qú| |¡ qúW x˜|D ]Ž}d|kr| d¡ d|ks8d|ks8d|kr¨xnt
|dd … ƒD ]Z\}‰ ‡ fdd„|d jD ƒ}t |¡}t |¡}|| dkrJ|d j| ||d < qJW d|kròd |dd … ¡}
t dd|
¡}
t|
 ¡ ƒdkròt dd|
¡}
d|kr´t|ƒdkrvd|kr | dd¡}d|kr6| dd¡}d|krL| dd¡}xt|ƒdkrh| ¡  qNW | |¡ n>xt|ƒdkr’| ¡  qxW t|ƒdk r¬| |¡ ||d< d|kr.xnt
|dd … ƒD ]Z\}‰ ‡ fd d„|d jD ƒ}t |¡}t |¡}|| dkrÐ|d j| ||d < qÐW d!|ksBd"|kr²xnt
|dd … ƒD ]Z\}‰ ‡ fd#d„|d jD ƒ}t |¡}t |¡}|| dkrT|d j| ||d < qTW d$|kr:x|tt|ƒƒD ]l}d%|| krð||  d%d&¡||< d|| kr||  dd&¡||< d'|| krÊ||  d'd&¡||< qÊW d(|ksNd)|kr¾xnt
|dd … ƒD ]Z\}‰ ‡ fd*d„|d jD ƒ}t |¡}t |¡}|| dkr`|d j| ||d < q`W d+|ksÜd,|ksÜd-|kr d |¡}t d.|¡}t d/|¡}t d0|¡}t d1|¡}|rTy$tj |  ¡ d2¡ !¡ }| "d2¡}W n   d}Y nX n¾|r’y$tj |  ¡ d3¡ !¡ }| "d2¡}W n   d}Y nX n€|rÐy$tj |  ¡ d4¡ !¡ }| "d2¡}W n   d}Y nX nB|ry$tj |  ¡ d5¡ !¡ }| "d2¡}W n   d}Y nX nd}xzt
|dd … ƒD ]f\}‰ ‡ fd6d„|d jD ƒ}t |¡}t |¡}|| dkr$|d j| ||d < ||d  }q$W q W ||
||fS )7N)Úheaderr]   r@   c                s    g | ]}t j |ˆ  d ¡¡‘qS )ú:)ÚtextdistanceÚdamerau_levenshteinÚnormalized_similarityrB   )rG   Ú	tmp_word_)Útmp_wordr   r   rI   ð   s    zmain.<locals>.<listcomp>r   g333333ã?Fr’   TrX   r    u   â€”ZPROVINSIZ	KABUPATENZKOTAr   c                s   g | ]}t j ˆ |¡‘qS r   )r“   r”   r•   )rG   r–   )r—   r   r   rI     s    ZNamaz[^A-Z. ]z[^A-Z.]ZNIKé   ÚDÚ0ú?Ú7ÚLÚ1r   ZAgamac                s   g | ]}t j ˆ |¡‘qS r   )r“   r”   r•   )rG   r–   )r—   r   r   rI   ?  s    ZStatusZ
Perkawinanc                s   g | ]}t j ˆ |¡‘qS r   )r“   r”   r•   )rG   r–   )r—   r   r   rI   I  s    ZAlamatú!ÚIrK   ZJenisZKelaminc                s   g | ]}t j ˆ |¡‘qS r   )r“   r”   r•   )rG   r–   )r—   r   r   rI   \  s    ZTempatZTglZLahirz([0-9]{2}\-[0-9]{2}\-[0-9]{4})z([0-9]{2}\ [0-9]{2}\ [0-9]{4})z([0-9]{2}\-[0-9]{2}\ [0-9]{4})z([0-9]{2}\ [0-9]{2}\-[0-9]{4})z%d-%m-%Yz%d %m %Yz%d-%m %Yz%d %m-%Yc                s   g | ]}t j ˆ |¡‘qS r   )r“   r”   r•   )rG   r–   )r—   r   r   rI   ˆ  s    )#ÚpdZread_csvÚLINE_REC_PATHÚCITIES_REC_PATHÚRELIGION_REC_PATHÚMARRIAGE_REC_PATHÚJENIS_KELAMIN_REC_PATHr>   rD   Údictro   rA   Úvaluesr   r6   rz   rB   Ú	NEXT_LINEr&   Ú
NEED_COLONr%   r~   Úremover|   ÚreÚsubÚreplaceÚpopr(   ÚsearchÚdatetimeÚstrptimer‹   r   Ústrftime)r)   Zraw_dfZ	cities_dfZreligion_dfZmarriage_dfZjenis_kelamin_dfr=   r;   rC   r†   ÚnamaÚtempat_lahirÚ	tgl_lahirZ	loc2indexrK   Ztmp_lineÚjZtmp_sim_listZ
tmp_sim_npZarg_maxZlast_result_listZuseful_infoZtmp_listZtmp_dataZ	tmp_indexZjoin_tmpZ
match_tgl1Z
match_tgl2Z
match_tgl3Z
match_tgl4r   )r—   r   ÚmainÝ   s   
























r¸   Ú__main__r   )r	   )rE   )$r!   Únumpyr   ÚosZpandasr¡   r9   r¬   r“   r±   r   Úoperatorr   r   ÚgetcwdZ	ROOT_PATHÚpathr|   r¢   r£   r¤   r¥   r¦   rª   r©   Z	ID_NUMBERr   r-   r>   rD   rT   r4   r¸   Ú__name__ÚsysÚargvr   r   r   r   Ú<module>   s8    
&

j :
