質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

282閲覧

resizeにより発生してしまったTypeError: only size-1 arrays can be converted to Python scalarsを直したい

itokina

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/07/06 14:44

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問