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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

355閲覧

pythonでキーを押した時のwebカメラ画像を保存したい

Natthy

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/06/05 03:18

実現したいこと

pythoの初心者です。
pythonで、webカメラの画像を表示し指定キーを入力した時に画像を保存したいです。

発生している問題

web検索で見つけたコードを組み合わせた以下のスクリプトを実行した所、webカメラの画像を画面に表示させることはできました。
ただ、キーボードの's'を入力した時に画像を保存して欲しいのですが画像が保存できません。
画像を保存できるようにするにはどのように変更すればよいのでしょうか。
また、6行目の "_,"を削除するとスクリプトが動作しなくなります。
この"_,"はどのような意味があってどんな働きをしているのか、ググっても分からなかったのですが併せて教えて頂けますでしょうか。

該当のソースコード

python

1import cv2 2import tkinter as tk 3from PIL import Image, ImageTk 4 5def show_frame(): 6 _, frame = cap.read() 7 frame = cap.read() 8 frame = cv2.resize(frame, (640.480)) 9 cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 10 img = Image.fromarray(cv2image) 11 imgtk = ImageTk.PhotoImage(image=img) 12 if cv2.waitKey(1) & 0xFF == ord('s'): 13 cv2.imwrite('test.jpg', frame) 14 15 label.imgtk = imgtk 16 label.configure(image=imgtk) 17 label.after(10,show_frame) 18 19cap = cv2.VideoCapture(0) 20root = tk.Tk() 21root.title("Webcam") 22label = tk.Label(root) 23label.pack() 24root.geometry("640x480") 25 26show_frame() 27root.mainloop() 28 29cap.release() 30cv2.destroyAllWindows()

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

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

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

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

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

guest

回答1

0

6行目の "_,"を削除するとスクリプトが動作しなくなります。

の方だけ。

pythonでは、関数の返り値を タプル にすることができます。
実際、cap.read() は、 (return, frame) という形のタプルを返し、それぞれ、取得の結果(True, False)と、取得したフレームが入っています。

これを通常どおり、

python

1 frame = cap.read()

のように受けると、 frameには (return, frame) というタプルが入ることになり、frame[0]で returnが、frame[1]でframe が取得できます。

また、pythonでは アンパックという機能があり、右辺にタプルなどのコレクションがあるときに、それに対応するタプルを左辺に書くことができます。前の例では、

python

1 ret, frame = cap.read()

とすると、retに returnが、 frame、にframeが入ることになり、入れ直す手間が省けます。

さらに、これは言語の仕様ではありませんが、代入されても、以降に使うつもりの無い変数は、「_」という文字を使う慣習があります。 上記のようにretで受けた場合、「このretは使われていないけど、どうなってるのだろう?」と思わせてしまいますが、明示的に「_」に代入することで、この値を捨てているということを示します。

python

1 _, frame = cap.read()

ちなみに、 「_」もただの文字=変数なので、returnの結果を_で参照することはできます。 そんなことをすると混乱するだけですが。

投稿2023/06/05 05:23

編集2023/06/05 15:26
TakaiY

総合スコア12765

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

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

Natthy

2023/06/05 13:55

pythonは返り値を二つ返すことができることも、アンパック機能も教えて頂き初めて知りました。 _に代入することで返り値の一つを明示的に捨てる意図を表す事も、コードの書き方の慣習かと思いますが初耳でした。 丁寧な回答を頂き誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問