본문 바로가기
SW 프로그래밍/파이썬

DVR CCTV 저장 영상 처리

by N2info 2022. 7. 26.

요즘 CCTV 영상은 H264포멧을 많이 사용한다

알리산 IP카메라를 통해 DVR에 저장된 영상의 시간은 종종 중국시간으로 표시되는 경우가 있다

 

영상에 나타난 날짜와 한국의 실제 영상과 차이가 날경우 영상을 추출하여 날자를 다시 화면에 표시할수 있는데

이에 대한 방법에 대한 정리이다.

 

#  h264 동영상 읽기 ok

import cv2
import datetime

import tkinter
from  tkinter import *
from tkinter import filedialog
import os

def fileout_fnc(mkString) :
    if(0):
        f = open(nowDatetime, 'a')
        f.write(mkString)
        f.close()

# 파일선택
root = tkinter.Tk()
root.title("Motion Dection PG  03.28  [OpenCV : "+ cv2.__version__ + "]")
root.geometry("400x200+150+100")  #윈도우이름.geometry("너비x높이+x좌표+y좌표")
root.resizable(True, True)
#listbox=Listbox(root, width=50)
listbox=Listbox(root)

# 파일경로와 파일명을 구분하는 작업
root.filename =  filedialog.askopenfilename(initialdir = "D:\sensorgatetest_avi", title = "Select file", multiple=True)
path, filename = os.path.split(root.filename[0])
dir = path[0]

#파일명에 영상 시작날짜정보가 있을 경우 이를 추출하는 작업
i = filename.find('.')

movie_year = filename[i-15:i-11]
movie_month = filename[i-11:i-9]
movie_day = filename[i-9:i-7]
movie_hour = filename[i-6:i-4]
movie_min = filename[i-4:i-2]
movie_sec = filename[i-2:i]

start_time = datetime.datetime(int(movie_year), int(movie_month), int(movie_day), int(movie_hour), int(movie_min), int(movie_sec))
time_gap = datetime.datetime.now() - start_time

# 동영상 위치정보표시
if(1):
    print("Working directory is  :",path[0])
    print("Working file name is  :",path[1])
    
ff = "Working directory is  :" +dir
fileout_fnc(ff)        

print("\nSelected file is  : ", len(root.filename))
fileout_fnc("\nSelected file List is : ")
fileout_fnc(str(len(root.filename)))
fileout_fnc("\n")

capture = cv2.VideoCapture(str(root.filename[0])) #ok

w = round(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = capture.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter(path[0]+'/conv'+path[1], fourcc, 10, (w, h))

# 동영상 정보표시
if(1):
    print("parh :",path)
    print("filename:",filename)
    print("root.filename[0] :",root.filename[0])
    print("cv2 version :", cv2.__version__)
    print("w :",path[0]+'/'+path[1])
    print("w :",w)
    print("h :",h)
    print("capture :",capture)
    print("capture.isOpened() :",capture.isOpened())
    print("cv2.CAP_PROP_FRAME_COUNT :",int(capture.get(cv2.CAP_PROP_FRAME_COUNT)))
    print(type(capture.get(cv2.CAP_PROP_FRAME_COUNT)))
    print("cv2.CAP_PROP_POS_FRAMES :",capture.get(cv2.CAP_PROP_POS_FRAMES))
    print("cv2.CAP_PROP_FRAME_WIDTH :",capture.get(cv2.CAP_PROP_FRAME_WIDTH))
    print("cv2.CAP_PROP_FRAME_HEIGHT :",capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
    print("cv2.CAP_PROP_FPS :",capture.get(cv2.CAP_PROP_FPS))
    print("cv2.CAP_PROP_FOURCC:",capture.get(cv2.CAP_PROP_FOURCC))
    print("cv2.CAP_PROP_POS_MSEC :",capture.get(cv2.CAP_PROP_POS_MSEC)) #Current position of the video file in milliseconds.

curr = datetime.datetime.now() - time_gap
while capture.isOpened():
    run, frame = capture.read()

    if not run:
        print("[프레임 수신 불가] - 종료합니다")
        break
    
    resolution = 'UTC+8  ' + str(int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)))+ 'x' + str(int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))) + '  ' + str(int(capture.get(cv2.CAP_PROP_FPS))) + 'fps'
    font=cv2.FONT_HERSHEY_SIMPLEX
    cv2.rectangle(frame,(w-530, 5),(w-20, 43),(255,0,0), -1)
    cv2.putText(frame, resolution, (w-500, 35), font, 1, (0, 255, 255), 2)
    curr = curr+ datetime.timedelta(milliseconds=(1000/fps))
    play_time = curr.strftime("%Y-%m-%d %H:%M:%S")
    cv2.putText(frame, play_time, (w-500, 70), font, 1, (0, 255, 255), 2)    

    cv2.imshow('video', frame)

if cv2.waitKey(1) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows()

위 소스를 실행하면 h264 확장자를 가진 동영상을 재생할수 있다.

 

실행결과