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

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

新規登録して質問してみよう
ただいま回答率
85.49%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

1回答

8615閲覧

カメラで撮影した画像を連番ファイルで保存したい

uriuri

総合スコア47

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2018/06/11 09:42

キーを押すごとに撮影した画像をsampleフォルダに連番ファイルとして保存したいと思っています
こちらを参考にしました
http://naga-tsuzuki.sblo.jp/article/175629833.html

python

1import cv2 2 3if __name__=="__main__": 4 5 capture = cv2.VideoCapture(0) 6 7 if capture.isOpened() is False: 8 raise("IO Error") 9 10 cv2.namedWindow("Capture", cv2.WINDOW_AUTOSIZE) 11 12 while True: 13 14 15 ret, image = capture.read() 16 17 if ret == False: 18 continue 19 20 cv2.imshow("Capture", image) 21 22 if cv2.waitKey(33) >= 0: 23 cv2.imwrite("sample/"%03.f"%(i)+".png"", image) 24 25 26 27 cv2.destroyAllWindows() 28

実行してみると画像は保存されるのですがファイル名がimg.pngとしてキーを押すごとに画像が更新されてしまいます
アドバイスしてもらえると助かります

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

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

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

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

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

guest

回答1

0

キーを押すごとに撮影した画像をsampleフォルダに連番ファイルとして保存したい

カウンタ変数iを用意するのが自然でしょうね。

Python

1i = 0 2while True: 3 ... 4 5 if cv2.waitKey(33) >= -1: 6 cv2.imwrite(f'image/{i:03d}.png', image) 7 i += 1

ところで

ご提示のコードですが、正常なルートでループを脱出できないですね。
たとえWebカメラの接続を引っこ抜いたとしてもループが空回りし続けます。

ループを抜けたいのならcontinueではなくbreakを使ってください。

Python

1if ret == False: # ここも単に not ret で良い 2 break

旧回答

註:
コードの仕様を勘違いして書いた回答です。
勘違いとは言え全く参考にならないわけではないですから、このような形で残しておきます。


while True の代わりに、itertools.countを使うと良いでしょう。

Python

1from itertools import count 2 3... 4 5for i in count(): 6 ... 7 8 cv2.imwrite(f'sample/{i:03d}.png', image)

気付いたのでもう一か所。画像を保存するタイミングが謎です。

Python

if cv2.waitKey(33) >= 0:

このコードですと、33ミリ秒ごとに何かしらのキーを連打しないと保存が効かないですね。
特定のキーの押下による脱出を検討しないなら、if文はそもそも不要です。

Python

1cv2.waitKey(33) 2cv2.imwrite(...)

投稿2018/06/11 09:46

編集2018/06/11 14:17
LouiS0616

総合スコア35660

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

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

uriuri

2018/06/13 09:09

丁寧な回答ありがとうございます 実際に試したところ if cv2.waitKey(33) >= -1: cv2.imwrite(f'image/{i:03d}.png', image) i += 1 imwriteのあとのfでエラーが出てしまいこれを取り除くことで実行できましたが保存されたファイルが{i:03d}.pngとなり連番になりませんでした 解決方法を教えていただけた幸いです
LouiS0616

2018/06/13 09:18

Pythonのバージョンが明記されていなかったので、最新であるという前提で回答しました。 質問にバージョンを書くようにしてくださいね。 フォーマット済み文字列リテラル(f)が使えないなら、次のようにしてみてください。 cv2.imwrite('image/{:03d}.png'.format(i), image)
uriuri

2018/06/13 09:48

バージョンを記入せずすみません 次回から気を付けたいと思います 無事実行できました ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問