openCV에서 gif 동영상을 반복하고 재생하는 방법

배경



현재 자작으로 사소한 OpenCV를 소개하는 웹 페이지를 작성하고 있습니다.
h tps : // 훗 아츠레 포인 ts. jp/오펜 cv_도 c/

에서 데이터 세트로 GIFMAGAZIN에서 GIF를 MP4로 변환하여 이미지 처리를하고 있습니다만, 그대로 cv2.imshow("window name", mat) 짧은 시간에 끝납니다.

여기서는 cv2.imshow() 를 사용하여 동영상 재생을 반복하는 방법을 작성해 보겠습니다.

gif to mp4



gif에서 mp4로 변환하는 방법이지만 두 가지가 있습니다. 하나는 gif를 브라우저에서 표시시키고 오른쪽 클릭으로 "다른 이름으로 동영상으로 저장"을 선택하여 변환하는 방법입니다. 또 다른 하나는 ffmpeg를 사용하여 변환하는 방법입니다. ( FFmpeg로 gif 애니메이션을 mp4로 변환 참조)
ffmpeg -i [gif ファイルパス]  -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" [mp4 ファイルパス] 

Method



반복 표시하는 방법은,
1. 한 번 동영상을 재생하고 모든 프레임을 배열에 저장
2. 무한 루프 안에 동영상 재생
3. 처리 중 종료 조건 설정
하면 됩니다.

개발



[ESC]로 동영상이 종료되지만 [S]를 누르면 프레임 이미지를 저장할 수 있습니다.
import numpy as np
import cv2
import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--src')
    args = parser.parse_args()

    cap = cv2.VideoCapture(args.src)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frames = []

    #一度動画を再生して、フレームを配列に格納する
    while cap.isOpened():
        _ret, frame = cap.read()        
        if frame is None:
            break
        frames.append(frame)
    cap.release()

    end = False
    while True:
        if end:
            break
        for frame in frames:
            cv2.imshow("loop a gif",frame)

            k = cv2.waitKey(int(fps)) & 0xFF

            # ESC で終了
            if k == 27:
                end = True
                break
            # S で画像保存
            elif k == ord("s"):
                cv2.imwrite("output.png", frame)

if __name__ == '__main__':
    main()

Consequence





Afterword



동영상(이미지) 데이터는 센토 군을 멈춰라! GIF 게임 을 사용해 보았습니다. 타이밍 잘 S 버튼을 누르면 "nice"라고 표시된 이미지가 저장됩니다. 상당히 파악하기 어렵습니다.
손잡이 시간에 부탁드립니다

좋은 웹페이지 즐겨찾기