0

cv2 とその他のモジュールを使用して、ビデオ ファイルをフレームに分割するスクリプトを作成しました。これまでは、ファイル パスを貼り付けてコードを実行するだけでよかったのですが、プロンプトに応じてユーザーにファイル パスと名前を入力してもらいたいと考えています。これは簡単なはずですが、 os.path を機能させるのに苦労しています。主な問題は、各画像ファイル (つまりフレーム) の名前に、シーケンス内の位置を示す番号を付けたいことです。以下のコードは私が持っているものです:

filepath = input('Please enter the filepath for the clip: ') 

clip = cv2.VideoCapture(filepath)

#### This code splits the clip into scenes

filepath1 = input('Please enter the filepath for where the frames should be saved: ') 

name = input('Please enter the name of the clip: ') 

ret, frame = clip.read()
count = 0
ret == True
while ret:
    ret, frame = clip.read()
    cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame))
    count += 1

ただし、次のエラーが発生します。

cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame))
    TypeError: Required argument 'img' (pos 2) not found

% count, frameos.path.join コマンドの括弧内に変数を含めると、別のエラーが発生します。

TypeError: not all arguments converted during string formatting

すべきことは、.pngname(x)のような場所に呼び出された多数の .png ファイルを書き込むことMYcomputer/mydesktop/myfolder/です。ここで何がうまくいかなかったのかわかりません。助けていただければ幸いです。

4

1 に答える 1

2

Your parenthesis placement as well as the usage of join is wrong This

cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame))

should be corrected to this:

cv2.imwrite(os.path.join(filepath1, name+'(%d).png'%count), frame)

To further improve the code I would suggest

fname = "{name}({count}).png".format(name=name, count=count)
cv2.imwrite(os.path.join(filepath1, fname), frame)

Here a brief explanation of os.path.join: It concatenates all the arguments with the path delimiter of your OS ("/" on Unix-Based and "\" on Windows). As the result, your original code would result in following string:

filepath1 = "some_dir"
name = "some_name"
count = 10
print(os.path.join(filepath1, name, '(%d)' % count,'.png'))
>>> "some_dir/some_name/10/.png"
于 2017-01-08T15:42:28.057 に答える