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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OpenCV

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

Python 3.x

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

Python

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

Q&A

1回答

1654閲覧

flask、Opencvでの写真撮影、及び保存の方法

ngh_orange

総合スコア17

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OpenCV

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/06/30 14:34

編集2022/07/01 14:05

前提

ラズパイZero、Python、Flask、Opencvを使ってWeb上から確認できるカメラを作っています
ストリーミングで常に確認でき、キャプチャーボタンを押したら今写っているところを画像として保存するようにしたいです

実現したいこと

現在、カメラの映像をWeb上からストリーミングで見ることはできるようになりました
https://qiita.com/RIckyBan/items/a7dea207d266ef835c48
こちらのサイトを参考にしました
そこで今写っている映像をキャプチャーし、画像ファイルとして「shot」フォルダに保存したいです

発生している問題・エラーメッセージ

Opencvでカメラを撮影する方法を調べ、それをPythonファイルにし、Captureボタンを押したらそのPythonファイルを実行したいのですが、すると下記のようなエラーが出てしまいます

Traceback (most recent call last) File "/home/〇〇/.local/lib/python3.9/site-packages/flask/app.py", line 2095, in __call__ return self.wsgi_app(environ, start_response) File "/home〇〇/.local/lib/python3.9/site-packages/flask/app.py", line 2080, in wsgi_app response = self.handle_exception(e) File "/home/〇〇/.local/lib/python3.9/site-packages/flask/app.py", line 2077, in wsgi_app response = self.full_dispatch_request() File "/home/〇〇/.local/lib/python3.9/site-packages/flask/app.py", line 1525, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/〇〇/.local/lib/python3.9/site-packages/flask/app.py", line 1523, in full_dispatch_request rv = self.dispatch_request() File "/home/〇〇/.local/lib/python3.9/site-packages/flask/app.py", line 1509, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/home/〇〇/cflask/app.py", line 35, in ccapture cameracap.ccapture() File "/home/〇〇/cflask/cameracap.py", line 8, in ccapture cv2.imwrite('./shot/test.jpg', frame) cv2.error: OpenCV(4.6.0) /tmp/pip-wheel-u79916uk/opencv-python_ea2489746b3a43bfb3f2b5331b7ab47a/opencv/modules/imgcodecs/src/loadsave.cpp:801: error: (-215:Assertion failed) !_img.empty() in function 'imwrite'

該当のソースコード

こちらがcameracap.py、撮影用のPythonファイルです

python

1import cv2 2def ccapture(): 3 print("a") 4 cap = cv2.VideoCapture(0) 5 ret, frame = cap.read() 6 cv2.imwrite('./shot/test.jpg', frame)

こちらがapp.py、flask起動用のファイルです

python

1import cv2 2from flask import Flask, render_template, Response 3 4from camera import Camera 5import cameracap 6 7app = Flask(__name__) 8 9 10@app.route("/") 11def index(): 12 return "Hello World!" 13 14@app.route("/stream") 15def stream(): 16 return render_template("stream.html") 17 18def gen(camera): 19 while True: 20 frame = camera.get_frame() 21 22 if frame is not None: 23 yield (b"--frame\r\n" 24 b"Content-Type: image/jpeg\r\n\r\n" + frame.tobytes() + b"\r\n") 25 else: 26 print("frame is none") 27 28@app.route("/video_feed") 29def video_feed(): 30 return Response(gen(Camera()), 31 mimetype="multipart/x-mixed-replace; boundary=frame") 32 33@app.route("/ccaptureh") 34def ccapture(): 35 cameracap.ccapture() 36 print("ok") 37 return render_template("stream.html") 38 39 40if __name__ == "__main__": 41 app.debug = True 42 app.run(host="0.0.0.0", port=5000) 43

試したこと

shotフォルダは同じフォルダに存在します。
png、jpgどちらもだめでした

補足情報(FW/ツールのバージョンなど)

python3.9.2
opencv 4.6.0
flask 2.1.2
ラズパイZero
これが環境です

どなたか教えていただけると幸いです

追記 07/01

教えていただきありがとうございます
genという関数に引数を一つ渡し、その引数でcamera.pyのほうにストリーミングか撮影かを判断させるように改造してみました
しかし、そもそもカメラが見つからないという「can't open camera by index」のエラーがでてその先が止まってしまいます
camera.pyの中身です

Python

1class Camera(object): 2 def __init__(self): 3 self.video = cv2.VideoCapture(0) 4 5 def __del__(self): 6 self.video.release() 7 8 def get_frame(self,v): 9 success, image = self.video.read() 10 if v == 0: 11 ret, frame = cv2.imencode('.jpg', image) 12 return frame 13 else: 14 cv2.imwrite('test.jpg', image)

app.pyの、一部です。ほかは上記のapp.pyと変わりません
genに引数を渡す処理だけ加えています

python

1@app.route("/ccaptureh") 2def ccapture(): 3 print("ccaptureh!!!!!!!!!!!") 4 Response(gen(Camera(),1)) 5 return render_template("stream.html")

app.pyのgenの改造後です

python

1def gen(camera,v): 2 print(v) 3 while True: 4 frame = camera.get_frame(v) 5 if v == 1:break 6 7 if frame is not None: 8 yield (b"--frame\r\n" 9 b"Content-Type: image/jpeg\r\n\r\n" + frame.tobytes() + b"\r\n") 10 else: 11 print("frame is none")

教えていただいたとおりに、インスタンスを作成し、引数を渡して判断するようにしてみましたが
ストリーミングは今まで通り成功するのですが、撮影が成功しません。どのように直せばいいでしょうか?

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

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

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

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

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

guest

回答1

0

提示リンクでは「恐らくOpenCVによるカメラへのアクセスは排他制御」と記載されています。
そのためccapture関数内でのOpenCV処理が失敗しているものと思われます。
対応としては、Cameraクラスの詳細が不明なので推測ですが、
Cameraクラスのインスタンスを作成してそれからget_frameしたものをファイル保存すればよいかと思われます。

追記

提示されている参考サイトのプロジェクトpi-cam-streamingに以下を追加することで画像をファイル保存することができました。

Python

1# app.py 2import cv2 3import numpy as np 4 5@app.route('/save_img') 6def save_img(): 7 camera = Camera() 8 frame = camera.get_frame() 9 a = np.frombuffer(frame, np.uint8) 10 img = cv2.imdecode(a, flags=cv2.IMREAD_COLOR) 11 cv2.imwrite('./test.jpg', img) 12 return "OK"

投稿2022/06/30 20:37

編集2022/07/02 09:27
can110

総合スコア38266

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

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

ngh_orange

2022/07/01 14:07

ご教授ありがとうございます。 自分の中では教えていただいたとおりに改良してみたのですが、エラーが発生してしまいます。質問を編集し、追記させていただきました。もしよろしければもう一度教えていただけないでしょうか?
can110

2022/07/02 09:30

提示コードは参考にされている元のものと大きく異なるようですが、元のものをそのまま生かしてできるようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問