a `e#7@sddlZddlmZddlZddlmZmZddlZddlZddl Z ddl Z ddl m Z ddl ZddlZddlmZddlmZddlmZddlmZmZmZGd d d Zd d Zd dZddZddZddZdS)N)Fraction)ceilfloor)Image)log) SrtFileParser) Parameters)BlackFrameCheckerSimilarityCheckerThresholdBlurCheckerc@s@eZdZedddZddZddZedd d Zd d Z d S) Video2Dataset) parameterscCst||_|jdurt|jnd|_|jdur4t|jnd|_|jdusN|jdur\t |j|jnd|_ |j |_ d|_ dSN)r blur_thresholdr blur_checkerdistance_thresholdr similarity_checkerblack_ratio_thresholdpixel_black_thresholdr black_checkerstart frame_indexf)selfr r#/code/opendm/video/video2dataset.py__init__s (zVideo2Dataset.__init__c Cs8d|_t}|jjdur6t|jjd|_|jdd|_g}|jjD]h}t j |}t d|t|}t ||jdurztjt j ||_Wqtj|_Yq0n|jtj|j|jd7_t d|j|jjrt j |d}|d|dg}d}|D]|} t j | rt d | zt| }|WqWn:ty} z t d | d}WYd} ~ n d} ~ 00qnd}|jdur:|jr:t} t d |j||jj |jj!t} t d | | t d |jj"t d|jj#t d|jj$t%&|} | 's^t ddS|jj dur| (t%j)|jj |jj |_*|jj }nd}|jj!dur|jj!|dn|j|}d}| 'r| +\}}|sq|jj!dur|j*|jj!krq|}t,|j*|d|d}||krNt-d|||j*|d|dd|.|||}|dur|jjdur|/|||durd|0vr|1|dq| 2qH|jdur|j3|jj4dur|jj4dkr|j|jj4krt d|jj4t5||jj4}t} t d| ||S)Nwztglobal_idx;file_name;frame_index;blur_score;is_blurry;is_black;last_frame_index;similarity_score;is_similar;written rzProcessing video: {}secondszUse pseudo start time: %sz.srtz.SRTzLoading SRT file: {}zError parsing SRT file: {}z>Preprocessing for black frame checker... this might take a bitzPreprocessing time: {:.2f}sz%Calculated luminance_range_size is {}z(Calculated luminance_minimum_value is {}z#Calculated absolute_threshold is {}z"Error opening video stream or filedz%[{}][{:3d}%] Processing frame {}/{}:  )endwrittenpathz,Limit of {} frames reached, trimming datasetzTotal processing time: {:.2f}s)6date_nowtimer Z stats_fileopenrwrite global_idxinputosr%basenamerODM_INFOformatget_video_infodatetime fromtimestampgetmtimenow timedelta total_frames frame_rateuse_srtsplitextexistsrparse ExceptionrZNeedPreProcessZ PreProcessrr#Zluminance_range_sizeZluminance_minimum_valueZabsolute_thresholdcv2 VideoCaptureisOpenedsetCAP_PROP_POS_FRAMESrreadrprint ProcessFrame WriteStatskeysappendreleasecloselimit limit_files)rrZoutput_file_paths input_file file_name video_infonameZ srt_files srt_parserZsrt_fileestart2r#ZcapZ start_frameZframes_to_processprogressretframeZ prev_progressstatsrrr ProcessVideos              (   "    ,zVideo2Dataset.ProcessVideocCs|j|jd}t|tj}|j\}}|jj}||ks>||kr~t||} || } tj |t t || t t || ftj d}|j dur|j ||j\} } | |d<| |d<| r|jd7_|S|jdur|j||j} | |d<| r|jd7_|S|jdurL|j||j\}}}||d<||d<||d <|rL|jd7_|S||||}d |d <||d <|jd7_|jd7_|S) N)rr* interpolation blur_score is_blurryr is_blacksimilarity_score is_similarlast_frame_indexTr$r%)rr*r=cvtColorCOLOR_BGR2GRAYshaper Zinternal_resolutionmaxresizeintr INTER_NEARESTrZIsBlurrZIsBlackrZ IsSimilar SaveFrame)rrUrNrPresZframe_bwhr resolutionmfactorrZr[r\r]r^r_r%rrrrDsF  .   zVideo2Dataset.ProcessFrame)rPc Cs|jj}|durl|j\}}}||ks,||krlt||}||} tj|tt|| tt|| ftjd}t j |jj d |j|j|j|jj} td|jj|\}} tj|j|jd} tddd| } tt| }d}}|dur|| }|| }| |jtddd}|d}|d}tjj d tjj!|tjj"|jddftjj#|jd dftjj$|j%&d rd nd tjj'd itj(j)|tj(j*|tj(j+|tj(j,|jdtj(j-|jd id}|durn|ddurdt|df|dtj(j.<|ddur&|ddf|dtj(j/<|ddurLt0|d|dtj(j1<|ddurn|d|dtj(j2<|durt3| |d|d |d|d<t4|}|j5| |dd| S)NrXz {}_{}_{}.{}.rilr z%Y:%m:%d %H:%M:%Sz%fODMrdjiDJIUnknown)Z0thExifZshutterrrZ focal_lenr!ZfnumZisoGPS_)exifquality)6r max_dimensionrbrcr=rdrer INTER_AREAr,r%joinoutputr/r-r*rZ frame_formatimencoder1r5r7rr(ioBytesIO get_entryZget_gpsr&strftimepiexifZImageIFDSoftwareDateTime XResolution YResolutionMakelower startswithModelExifIFDDateTimeOriginalDateTimeDigitized SubSecTimePixelXDimensionPixelYDimension ExposureTime FocalLengthfloat_to_rationalFNumberISOSpeedRatingsget_gps_locationdumpsave)rrUrNrPmax_dimrir_rkrlr%bufdelta elapsed_timeimgentryZ gps_coordsZ exif_timeZelapsed_time_strZsubsec_time_strZ exif_dictZ exif_bytesrrrrgsb  .          zVideo2Dataset.SaveFramecCs|jd|d||dd|vr(|dndd|vr:|dndd|vrL|dndd|vr^|dndd |vrp|d ndd |vr|d ndd |vr|d nd d d dS)Nz{};{};{};{};{};{};{};{};{};{} r*rrZr[r\r_r]r^r$rm,)rr)r/replace)rrLrVrrrrEs  zVideo2Dataset.WriteStatsN) __name__ __module__ __qualname__rrrWrDrrgrErrrrr s  u3Br cCs^t|}tjtj|d}t|tj}|tj }| t dgd|||S)NrZ VideoInfo)r6r7r-) r=r>r,r%r9r-regetCAP_PROP_FRAME_COUNT CAP_PROP_FPSrH collections namedtuple)rLvideor-r6r7rrrr0s   r0cCst|}|j|jfSr)rlimit_denominator numerator denominator)rrrrr"s rcCst||kr|Sg}tdt|}tjdt|d|td}t|t|}t|}t||}|D]}t ||qh|S)Nrr )dtype) lennparangelinspacerer@arraylistr,remove)pathsrJZto_keepZ all_idxesZ keep_idxesZ remove_idxespidxrrrrK&s   rKcCsj|dkr|d}n|dkr$|d}nd}t|}t|}||d}t|}t||dd}||||fS)zconvert decimal coordinates into degrees, munutes and seconds tuple Keyword arguments: value is float gps-value, loc is direction list ["S", "N"] or ["W", "E"] return: tuple like (25, 13, 48.343 ,'N') rr r<)absreround)valuelocZ loc_valueZ abs_valuedegt1minsecrrrto_deg7s   rc Cst|ddg}t|ddg}t|dt|dt|df}t|dt|dt|df}tjjdtjj|d i}|dur|dur|d |tjj<||tjj<|d |tjj <||tjj <|durd|tjj <tt ||tjj <|S) NSNWErr rs)rsrrrz%Y:%m:%d)rrrZGPSIFD GPSVersionIDZ GPSDateStamprGPSLatitudeRef GPSLatitudeGPSLongitudeRef GPSLongitudeGPSAltitudeRefr GPSAltitude) rlatZlngaltitudeZlat_degZlng_degZexiv_latZexiv_lngZgps_ifdrrrrIs ""   r) r1 fractionsrr}mathrrr'r=r,rPILrnumpyrropendmrZopendm.video.srtparserrZopendm.video.parametersrZopendm.video.checkersr r r r r0rrKrrrrrrs,