My Project/CCTV(Python)

5. Python으로 CCTV의 RTSP영상을 OpenCV로 저장하기

코딩 잘 할거얌:) 2021. 9. 15. 14:41
반응형

이전 포스팅에서는 RTSP로 CCTV 영상을 받아오는 것을 했다. 이제는 받아온 영상을 보는 것뿐만 아니라 파이썬을 이용하여 영상 저장하도록 하자.

 

내 마음속 저장(...)


OpenCV란

OpenCV는 C와 C++로 작성되어 vision인식, 머신러닝 그리고 이미지 프로세싱에 사용되는 오픈소스 라이브러리이다. Python에 바인딩이 되어 사용이 가능한 것이다. 그래서 OpenCV를 이용해서 동영상 저장을 하고 가능하다면 CCTV에 움직임이 감지되면 사진도 자동 저장되는 기능도 추가해보도록 하자. 더 자세한 내용은 아래 링크를 참고하기 바란다.

https://www.geeksforgeeks.org/opencv-overview/

 

OpenCV - Overview - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

그리고 코드는 아래 블로그를 참고하였다.

https://hoony-gunputer.tistory.com/entry/opencv-python-%EB%B9%84%EB%94%94%EC%98%A4-%EC%9D%BD%EA%B3%A0-%EC%93%B0%EA%B8%B0

 

[opencv-python] 비디오 읽고 쓰기

비디오 읽고 쓰기 이전에는 사진을 읽고 저장했다면 이번에는 비디오를 읽고 써보겠습니다. 비디오를 읽어 오기 위해서는 컴퓨터에 웹켐이 필요합니다. 그리고 웹캠을 실행하기 위해서 권한

hoony-gunputer.tistory.com


바로 코드를 보도록 하자

import cv2
import datetime
import os


def writeVideo():
    #현재시간 가져오기
    currentTime = datetime.datetime.now()
    
    #RTSP를 불러오는 곳
    video_capture = cv2.VideoCapture('rtsp://admin:admin@192.168.0.2:554')
    
    # 웹캠 설정
    video_capture.set(3, 800)  # 영상 가로길이 설정
    video_capture.set(4, 600)  # 영상 세로길이 설정
    fps = 20
    # 가로 길이 가져오기
    streaming_window_width = int(video_capture.get(3))
    # 세로 길이 가져오기
    streaming_window_height = int(video_capture.get(4))  
    
    #현재 시간을 '년도 달 일 시간 분 초'로 가져와서 문자열로 생성
    fileName = str(currentTime.strftime('%Y %m %d %H %M %S'))

    #파일 저장하기 위한 변수 선언
    path = f'D:/cctv/cctv/python/{fileName}.avi'
    
    # DIVX 코덱 적용 # 코덱 종류 # DIVX, XVID, MJPG, X264, WMV1, WMV2
    # 무료 라이선스의 이점이 있는 XVID를 사용
    fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
    
    # 비디오 저장
    # cv2.VideoWriter(저장 위치, 코덱, 프레임, (가로, 세로))
    out = cv2.VideoWriter(path, fourcc, fps, (streaming_window_width, streaming_window_height))

    while True:
        ret, frame = video_capture.read()
        # 촬영되는 영상보여준다. 프로그램 상태바 이름은 'streaming video' 로 뜬다.
        cv2.imshow('streaming video', frame)
        
        # 영상을 저장한다.
        out.write(frame)
        
        # 1ms뒤에 뒤에 코드 실행해준다.
        k = cv2.waitKey(1) & 0xff
        #키보드 esc 누르면 종료된다.
        if k == 27:
            break
    video_capture.release()  # cap 객체 해제
    out.release()  # out 객체 해제
    cv2.destroyAllWindows()

if __name__ == "__main__":
    writeVideo()

코드는 위에 천천히 읽으면 된다.

 

내가 코드 이것저것 만져보며 알게 된 추가적인 사실을 적어보았다.

  • RTSP의 포트번호는 554이다. 
  • rtsp://admin:admin에서 admin:admin은 rtsp에 접근할 때 아이디 비밀번호이다
  • CCTV가 야외 혹은 외부에 설치할 경우, 타인의 대화를 녹음하는 것이 불법이므로 오디오녹음하는 것은 조심해야 한다.
  • 영상 파일은 저장되지만 파일 이름이 저장이 되지 않을 경우는, 파일 이름 형식을 지원하지 않는 경우이다. 내가 겪은 경우는 '%Y_%m_%H' 이렇게 언더바와 섞어서 아용하니 영상파일은 저장되지만 이름이 저장이 안 된 경우가 발생했었다.
  • DIVX는 유료 라이선스이다. 그에 맞게 무료 라이선스로 나온 것이 XVID로 성능은 DIVX에 뒤처지지 않는다고 한다. 자세한 건 잘 모르나 개인적으로 충분히 쓸만하다고 느꼈다.
  • cv2.videoCapture에서 오류가 나면 아무것도 뜨지 않는다.
  • 영상 크기는 1080p 카메라 기준으로 1분 30초 저장 시 약 80MB가 저장되었다. 24시간 녹화한다고 가정했을 때, 대략 76GB인데 대책이 필요한 거 같다.
  • divx, mjpg, wmv1, wmv2, xvid, x264 모두 영상 저장해보았다. x264는 오류가 발생했었다. 영상 크기 순서는 wmv1<=XVID=DIVX<wmv2<mjpg순서이다.

streaming video로 뜨는 것을 확인 할 수 있다.


오류, 지적사항 그리고 궁금한 것은 댓글 부탁드립니다.

728x90