前提・実現したいこと
ここに質問の内容を詳しく書いてください。
https://qiita.com/rana_kualu/items/d386aa4c63425b88b895
このページで紹介されているサンプル画像と類似したシーンを抜き出すことをしたいと思っています。サンプル画像のサイズがあっていないとエラーを起こしてしまうのでresizeのコードを挿入したところこのようなエラーが出てしまいました。どう書き換えるべきなのでしょうか?
発生している問題・エラーメッセージ
TypeError: only size-1 arrays can be converted to Python scalars
該当のソースコード
Python
ソースコード
from skimage.measure import compare_ssim
import cv2
import os
import glob
def save_frame(video_path, frame_num, result_path):
"""
対象のフレームを画像に保存する。
Parameters ---------- video_path : string 動画フルパス frame_num : int フレーム数 result_path : string 保存先の画像フルパス Returns ------- ret : boolean キャプチャできたらTrue。 """ cap = cv2.VideoCapture(video_path) cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num) ret, frame = cap.read() # cv2.imwriteは日本語使えないので、一度テンポラリに保存してから移動する temporary_path = 'テンポラリのディレクトリ' if ret: cv2.imwrite(temporary_path, frame) shutil.move(temporary_path, result_path) return True return False
def get_ssim_list(imageFileName, movieFileName, frameStart=0, frameFinish=9999, frameStep=1):
"""
動画のSSIMを求める
Parameters ---------- imageFileName : string 画像ファイルのフルパス movieFileName : string 動画ファイルのフルパス frameStart : int 調べる開始フレーム frameFinish : int 調べる終了フレーム frameStep : int フレームを飛ばす数。1だととても遅い。 Returns ------- ssimArray : array {フレーム:SSIM} """ # 初期値 imageData = cv2.imread(imageFileName) movieData = cv2.VideoCapture(movieFileName) ssimArray = {} frame = frameStart while frame < frameFinish: # 画像を取得 movieData.set(cv2.CAP_PROP_POS_FRAMES, frame) ret, movieImageData = movieData.read() # 取れなくなったら終わり if not ret: break # 返り値に積む (H, W) = imageData[:2] # to resize and set the new width and height movieImageData = cv2.resize(movieImageData, (W, H)) ssimArray[frame] = compare_ssim(imageData, movieImageData, multichannel=True) # 次フレーム frame += frameStep return ssimArray
比較元画像
defaultImage = 'ディレクトリ'
調査元動画ディレクトリ
movieDir = 'ディレクトリ'
画像の出力先ディレクトリ
imageDir = 'ディレクトリ'
動画リストを取得
movieArray = glob.glob(movieDir + '*.mp4', recursive=True)
動画リストでループ
for movieFile in movieArray:
# 保存ファイル名を作成
a = os.path.basename(movieFile)
saveImageFile = imageDir + os.path.splitext(a)[0] + ".png"
# まず大まかに調べる ssimList1 = get_ssim_list(defaultImage, movieFile, frameStart=0, frameFinish=600, frameStep=30) nearFrame = max(ssimList1, key=ssimList1.get) # 一番近いところの周囲をフレーム単位で調査 ssimList2 = get_ssim_list(defaultImage, movieFile, frameStart=max(0, nearFrame-28), frameFinish=nearFrame+28, frameStep=1) nearestFrame = max(ssimList2, key=ssimList2.get) # 保存する save_frame(movieFile, nearestFrame, saveImageFile)
補足情報(FW/ツールのバージョンなど)
Python 3.7.3
OpenCV 4.1.0
あなたの回答
tips
プレビュー