実現したいこと
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
回答1件
あなたの回答
tips
プレビュー