동영상 편집의 일이 늘어나고 있기 때문에, 찍은 동영상의 내용을 간단하게 파악하고 싶어서, 몇개의 장면을 픽업한 화상을 간단하게 생성할 수 없는가 생각해 보았다
소개
취미가 높아 동영상 촬영이나 편집의 일이 늘어나는 가운데, 30만엔 가까이 내고 4K카메라를 구입해 여러가지 촬영을 하는 나날이 계속되고 있는 오늘 요즘.
촬영한 동영상이 너무 많아서 곤란하고 있었기 때문에, 타이틀에 있는 대로 동영상을 하나하나 보지 않아도 썸네일로 내용을 파악할 수 있는 화상이 필요해져, 그런 화상을 생성하는 스크립트를 만들어 보았으므로 메모 합니다.
실행 환경
사전 준비
다음과 같은 폴더 구성으로 합니다.
┬ make_img.py
├ mp4
│ ├ 動画1.mp4
│ └ 動画2.mp4
└ img
mp4라는 폴더에 동영상 데이터를 넣고 img라는 빈 폴더를 만듭니다.
스크립트 만들기
make_img.pyfrom glob import glob
import cv2
import os
import random
def make_thumb(filename):
# 対象ファイルの取得
cap = cv2.VideoCapture(filename)
# 総フレーム数の取得
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# サムネイルの行列数
row = 4
col = 4
num = row * col
cnt = 0
for r in range(row):
for c in range(col):
# フレーム番号の取得
if cnt == 0:
j = int(0.5 * frames / num)
else:
j = int(frames / num) * (cnt)
# フレームの移動とキャプチャ
cap.set(cv2.CAP_PROP_POS_FRAMES, j)
ret, frame = cap.read()
# 画像リサイズ
h = int(frame.shape[1] / col)
w = int(frame.shape[0] / col)
frame = cv2.resize(frame, (h, w))
# 取得したフレームを横に結合
if c == 0:
im = frame
else:
im = cv2.hconcat([im, frame])
cnt += 1
# 横に結合した画像を縦に結合
if r == 0:
img = im
else:
img = cv2.vconcat([img, im])
cap.release()
return img
def main(bgn=0):
# ファイル一覧の取得
files = glob("./mp4/*.mp4")
files.sort()
print("ファイル数 :", len(files))
i = bgn
for filename in files[bgn:]:
print("\r{:05} {}".format(i, filename), end="")
img = make_thumb(filename)
# 画像の保存
f = "./img/" + filename.split("/")[-1].replace("mp4", "jpg")
cv2.imwrite(f, img)
i += 1
print()
if __name__ == "__main__":
main()
스크립트 실행
다음 명령으로 실행합니다.
$ python make_img.py
실행하면 다음과 같은 이미지가 img 폴더에 저장됩니다.
할 수 있었다!
Reference
이 문제에 관하여(동영상 편집의 일이 늘어나고 있기 때문에, 찍은 동영상의 내용을 간단하게 파악하고 싶어서, 몇개의 장면을 픽업한 화상을 간단하게 생성할 수 없는가 생각해 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mix_dvd/items/1ac355b2d3ff8c25dc96
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
┬ make_img.py
├ mp4
│ ├ 動画1.mp4
│ └ 動画2.mp4
└ img
make_img.py
from glob import glob
import cv2
import os
import random
def make_thumb(filename):
# 対象ファイルの取得
cap = cv2.VideoCapture(filename)
# 総フレーム数の取得
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# サムネイルの行列数
row = 4
col = 4
num = row * col
cnt = 0
for r in range(row):
for c in range(col):
# フレーム番号の取得
if cnt == 0:
j = int(0.5 * frames / num)
else:
j = int(frames / num) * (cnt)
# フレームの移動とキャプチャ
cap.set(cv2.CAP_PROP_POS_FRAMES, j)
ret, frame = cap.read()
# 画像リサイズ
h = int(frame.shape[1] / col)
w = int(frame.shape[0] / col)
frame = cv2.resize(frame, (h, w))
# 取得したフレームを横に結合
if c == 0:
im = frame
else:
im = cv2.hconcat([im, frame])
cnt += 1
# 横に結合した画像を縦に結合
if r == 0:
img = im
else:
img = cv2.vconcat([img, im])
cap.release()
return img
def main(bgn=0):
# ファイル一覧の取得
files = glob("./mp4/*.mp4")
files.sort()
print("ファイル数 :", len(files))
i = bgn
for filename in files[bgn:]:
print("\r{:05} {}".format(i, filename), end="")
img = make_thumb(filename)
# 画像の保存
f = "./img/" + filename.split("/")[-1].replace("mp4", "jpg")
cv2.imwrite(f, img)
i += 1
print()
if __name__ == "__main__":
main()
스크립트 실행
다음 명령으로 실행합니다.
$ python make_img.py
실행하면 다음과 같은 이미지가 img 폴더에 저장됩니다.
할 수 있었다!
Reference
이 문제에 관하여(동영상 편집의 일이 늘어나고 있기 때문에, 찍은 동영상의 내용을 간단하게 파악하고 싶어서, 몇개의 장면을 픽업한 화상을 간단하게 생성할 수 없는가 생각해 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mix_dvd/items/1ac355b2d3ff8c25dc96
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ python make_img.py
Reference
이 문제에 관하여(동영상 편집의 일이 늘어나고 있기 때문에, 찍은 동영상의 내용을 간단하게 파악하고 싶어서, 몇개의 장면을 픽업한 화상을 간단하게 생성할 수 없는가 생각해 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mix_dvd/items/1ac355b2d3ff8c25dc96텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)