質問するログイン新規登録

Q&A

解決済

1回答

283閲覧

USBカメラで2回写真撮影し、撮影毎に進捗がわかるよう、表示画像を2回更新したい

Ta2S

総合スコア5

Python 3.x

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

0グッド

0クリップ

投稿2023/10/08 06:21

0

0

実現したいこと

USBカメラで2回写真撮影し、撮影毎に進捗がわかるよう、表示画像を2回更新したいです。

前提

Pythonを独学で学習し始めて、約3か月の初心者です。
VSCode 1.81.1 Python 3.11.4 Opencv-python 4.7.0.72 PySimpleGUI 4.60.5
スペースキーを押すと、2つのLEDを2chリレーでON/OFFし、1つのカメラで2回撮影
撮影は4656x3496、1fps、リサイズして表示画像を更新
スライダーは画面に表示していますが、まだ使用していません
画像更新以外は問題なく動作しています   

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

エラーメッセージは出ません。 画像の更新を2回したいが、2回目の更新時の1回しか更新せず、更新した画像が、次の3つのどれかになります。 ・1回目の撮影画像 ・2回目の撮影画像 ・1回目の撮影画像と2回目の撮影画像が上下に分かれて一体化した画像

該当のソースコード

USBカメラ、USBリレー等の初期設定は割愛しています。 # 処理待ち関数の定義 async def wait(): await asyncio.sleep(1) print("Waited for 1 second") async def main1(): # 1秒待ち await wait() async def main2(): # 2秒待ち await wait() await wait() layout = [ [sg.Frame('', [ [sg.Image(data=cv2.imencode('.png', frame_resized)[1].tobytes(), key='-IMAGE-')]], key='-FRAME1-'), sg.Frame('', [[sg.Text('透過光感度  低感度:1<==>10:高感度')], [sg.Slider((1, 10), 3, 1, orientation='h', key='SLIDER1')], [sg.Text('反射光感度  低感度:1<==>10:高感度')], [sg.Slider((1, 10), 3, 1, orientation='h', key='SLIDER2')], [sg.Text(' ')],[sg.Text(' ')], [sg.Text('検査スタート')], [sg.Text('[PUSH]または[スペース]キーを押してください')], [sg.Text(' ')], [sg.Text('終了')], [sg.Text('[ESC]キーを押してください')]])] ] window = sg.Window('window', layout, return_keyboard_events=True, size=(1920, 1060), keep_on_top=True, finalize=True, modal=True, grab_anywhere=False, grab_anywhere_using_control=False, resizable=False, disable_minimize=True) while True: event, values = window.read() if event == sg.WIN_CLOSED: break elif event == 'Escape:27': break elif event == ' ': # スペースキーが押されたら画像を更新する # ■■■■■■■■■■透過検査用■■■■■■■■■■ cap.set(cv2.CAP_PROP_EXPOSURE, -3) # ■■LEDの光量に応じて撮影時間を再設定■■ # リレー2LED1をONにする device2.write(RELAY_ON_CMD21) # 制御チップCH552G 左 # LED1安定化待ち時間 asyncio.run(main2()) # 2秒 # 画像の取得 ret, frame = cap.read() # 画像のリサイズ frame_resized = cv2.resize(frame, (1280, 1024)) # 画像の更新 window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized)[1].tobytes()) # リレー2LED1をOFFにする device2.write(RELAY_OFF_CMD21) # 制御チップCH552G 左 # ■■■■■■■■■■通常検査用■■■■■■■■■■ cap.set(cv2.CAP_PROP_EXPOSURE, -4) # ■■LEDの光量に応じて撮影時間を再設定■■ # リレー2LED2をONにする device2.write(RELAY_ON_CMD22) # 制御チップCH552G 右 # LED2安定化待ち時間 asyncio.run(main2()) # 2秒 # 画像の取得 ret, frame = cap.read() # 画像のリサイズ frame_resized = cv2.resize(frame, (1280, 1024)) # 画像の更新 window['-IMAGE-'].update(data=cv2.imencode('.png', frame_resized)[1].tobytes()) # リレー2LED2をOFFにする device2.write(RELAY_OFF_CMD22) # 制御チップCH552G 右

試したこと

処理が間に合っていないのではないかと思い、
LED安定化待ちをtime.sleep(2)からasyncio.run(main2())に変更したが、変化なし。
ret, frame = cap.read()の後に、asyncio.run(main2())を入れてみたが、変化なし。
frame_resized = cv2.resize(frame, (1280, 1024))の後に、asyncio.run(main2())を入れてみたが、変化なし。
cap.set(cv2.CAP_PROP_EXPOSURE, -3) 等の再設定を無効にしても、変化なし。

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

環境:
i5-7400 16GBメモリ 256GBSSD QuadroP600Video Windows11
VSCode 1.81.1 Python 3.11.4 Opencv-python 4.7.0.72 PySimpleGUI 4.60.5

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

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

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

guest

回答1

0

自己解決

自己解決しました。
もう一つ質問していたTkinterの表示問題の回答より、画像更新時に、適宜window.Refresh()でウィンドゥの更新をすればよいことに、たどりつきました。
また、window.Refresh()を使用することで、「1回目の撮影画像と2回目の撮影画像が上下に分かれて一体化した画像」は、1回目の撮影では発光していなかったための勘違いと気づきました。
LED発光安定化のための待ち時間が、次の発光までに時間が空くと長く必要になり、短時間に繰り返し発光すると短くなる傾向があるようで、
2秒=足りないことが多々発生、3秒=若干足りない時がある、4秒=安定化OK
であったための勘違いでした。
アナログリレーで制御している、LEDに調光器をつけている、も影響しているかもしれません。
ありがとうございました。

投稿2023/10/09 20:57

Ta2S

総合スコア5

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問