요즘 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 확장자를 가진 동영상을 재생할수 있다.
실행결과