■細かな不具合修正 カメラが4656x3496に対し、表示を1280x1024にしていたが、縦横比を同じにし、1280x961に変更。 location=(0,0)を入れているにもかかわらず、windowが右に10dotほどズレている。 window.current_location()で調べてみても(0,0)が返ってくる。 とりあえず、size=(1900, 1000)で横を空けて対処を先送りし、下も空けて、タスクバーが見えるようにし、何らかの対処が可能なようにした。 (最前面に表示は譲っていないので、意味があるかどうかはわからないが・・・) ■NotePCデモ用の低HD解像度1366x768バージョンの作成 表示・リサイズ解像度の設定をいじるだけなので、簡単に作成できた。 ■バッチファイル起動化 これに一番時間がかかった。 pauseを入れてチェック。 まず、ファイルが見つからない、となって起動できない。 調べてみると、コマンドプロンプトは、windowsとは違い、スペースを入れることができないことがあるらしい。 ファイル名にスペースは入れられないが、フォルダのスペースは、フォルダに移動してから起動すると、回避できるらしい。 とりあえず下記の様に、スペースを含むフォルダに移動し、スペースを削ったファイル名で起動するようにした。 CD C:/code/py311/Ta2S Inspection soft python.exe Ta2SInspection018FullHD.py 起動はするようになったが、hidapiでエラーが出て終了する。 VSCodeでもhidapiの認識に時間がかかっていて、起動即実行ではエラーが出ており、しばらく待ってから実行していたが、バッチファイルでは回避できそうにない。 いちいちパソコン毎に環境変数の設定をするのは面倒。 ユーザーがパソコンを変えた時に、どうするかという問題もある。 バッチファイルでパスを通す方法は見つからなかったが、一時的にパスを通す方法は見つかった。 今回は、一時的にパスを通してから起動するようにし、問題を先送りした。 $ENV:Path+=";C:\Users\tamta\AppData\Local\Programs\Python\Python311\Lib\site-packages" CD...
投稿
- リンクを取得
- ×
- メール
- 他のアプリ
Numpyで高速に四角書き込みする前に、それ以外の部分を仕上げることにした。 まず、状態・判定を絵で表示して、わかりやすくする。 「準備完了」絵、「検査中」絵、「Good」判定絵、「Bad」判定絵をGIMPで作成し、400x300のpngファイルで保存した。 これをメモリに先に読み込み、メモリから高速に表示・更新しようとしたが、「準備完了」の表示はできたが、他の絵に更新ができない。 いろいろ調べると、OpenCVを使用すればできるようだが、できるだけシンプルに仕上げたい。 かなり試行錯誤した結果、表示だけメモリに読み込み表示、他はSSDから読み込む方法で妥協した。 image_path_push = 'C:/code/py311/Ta2S Inspection soft/pic_PUSHStart.png' image_path_inspect = 'C:/code/py311/Ta2S Inspection soft/pic_Inspect.png' image_path_good = 'C:/code/py311/Ta2S Inspection soft/pic_GoodPUSHStart.png' image_path_bad = 'C:/code/py311/Ta2S Inspection soft/pic_BadPUSHStart.png' image_push = sg . Image ( 'C:/code/py311/Ta2S Inspection soft/pic_PUSHStart.png' ) (image_path_pushは不要だが、しばらく残す) layout = [ [ sg . Frame ( '' , [ [ sg . Image ( data = cv2 . imencode ( '.png' , frame_resized )[ 1 ]. tobytes (), key = '-IMAGE-' )]], key = '-FRAME1-' ), sg . Frame ( '' , [[ sg . Text ( ...
- リンクを取得
- ×
- メール
- 他のアプリ
teratailでの質問の結果は、 カメラ撮影してPillowで書き込んだ画像をリサイズして表示更新したい それなりに動くようになって確認できたことは、次の通り。 Numpyデータのままでは、Pillowでsave保存できない。 OpenCVとNumpyとPillowの変換時に、RGBとBGRの並びが変わったり変わらなかったりする。 BGRの並びの時に、Pillowで赤枠でBに書き込んだため、RGBに戻して表示更新すると青枠になっていた。 青枠で書き込み、RGBに戻して表示更新すると赤枠になり、本来の目的の色で正常に表示される。 (RGBに戻してからPillowで赤枠を書き込み、表示更新してもよさそう。) 処理毎に、RGBなのかBGRなのか、把握しておく必要があるため、処理の後ろに、#RGB、#BGR、#RGB=>BGR、などとコメントを入れて、間違えないようにした方が良い。 更にチェックしていくと、 #BGRなどとコメントを入れていくと、平均値の計算部分もBGR用に修正していないことにも気づいた。 被検査物を半分撮影範囲に入った状態で、間違って検査開始ボタンを押してしまうと、全面塗りつぶし描画になり、1分程度無反応になってしまう問題も発見できた。 PillowでBGRからRGBへの変換ができない。 無反応時間の短縮には、 欠点の検出数を制限してエラー判定し、四角の書き込みをやめる。 Numpyで高速に四角書き込みする。 方法を思いついたが、 検出数制限では、どの程度の数で止めたらいいか、入れ子が複雑でも作成できるか? 今回は画像の保存は必要ないが、次予定で画像を保存する必要が出てくる可能性がある。 画像保存等でNumpyとPillowを行き来すると、プログラムが複雑になる。 ことから、Numpyで高速に四角を書き込めれば、無反応時間が短くなり検出数制限が必要なくなるし、画像保存も簡単になるし、プログラムが簡単になるし、いいことずくめでは? と思いチャレンジしてみることにする。 問題は、Numpyを使っても遅いプログラムしか書けないことがある程度かな。
- リンクを取得
- ×
- メール
- 他のアプリ
teratailでの回答の結果を元に、本プログラムの修正にかかった。 Pythonでの画像処理の計算速度を改善したい もたもたしながらも、カメラで撮影した画像を表示まではそれなりに順調に進んだが、 リサイズと、表示更新でエラーが出てしまう。 リサイズ前に、欠点を四角で囲んだ画像を保存してみると、 きちんと欠点を四角で囲めているし、スライドバーでの感度調整も正常に動作しているようだ。 ピクセル数、ビット数、に問題はなく、ビューワーなどで正常に表示できる。 Webで調べていろいろ試してみたが、エラーが出たり、暴走したりする。 データの型の問題ぽいのだが、何を確認したらよいかもわからない。 またもやteratailのお世話になることにした。
- リンクを取得
- ×
- メール
- 他のアプリ
今日は、asyncioの使い方を見直し、できるだけ簡単なわかりやすいコードの使い方で組み込むことにした。 LED安定化待ち時間は、 asyncio.run(asyncio.sleep(4)) # 4秒待ち DEBUG用の待機時間は、 # DEBUG用wait時間の設定 0(DEBUG無し) or 5(DEBUG用) debug_time = 5 # DEBUG用待ち時間 asyncio.run(asyncio.sleep(debug_time)) また、USBカメラの露光時間設定を変数に変更 # 反射露光時間設定 r_time = -4 # 透過露光時間設定 s_time = r_time + 2 # 初期設定 cap.set(cv2.CAP_PROP_EXPOSURE, r_time) # ■■反射撮影の露光時間を設定■■ # 検査ループでの設定 cap.set(cv2.CAP_PROP_EXPOSURE, r_time) # ■■反射撮影の露光時間を再設定■■ cap.set(cv2.CAP_PROP_EXPOSURE, s_time) # ■■透過撮影の露光時間を再設定■■ これで、 非同期待ち時間を容易に変更できるようになり、 DEBUG用の途中経過表示を1か所でON/OFF制御でき、 2種撮影の露光時間も容易に変更できるようになった。 検査時は時短優先だが、機器トラブルなどの時に止めることで、トラブル原因の解消が早くできるようになる。
- リンクを取得
- ×
- メール
- 他のアプリ
teratailへの質問の結果 Pythonでの画像処理の計算速度を改善したい melian様に最後までお付き合い頂け、配列計算でNumPyを若干理解でき、NumPyを使用した高速なプログラムに書き換えられました。 約19秒かかっていた処理部分を、1.1秒強にまで短縮できました。 なおかつ、RGBを分けたNumPyを理解できていなかった私にも認識しやすいコードとなり、本プログラムに組み込んでも、スライダーによるしきい値の変更処理も自分で応用組み込みができそうなコードになりました。 melian様ありがとうございました。 ただ、なぜ平均値出しを整数化すると間違った計算結果になるのか全くわかっていない上、最後に教えていただいたコードの内容でなぜ正常に計算できるかわかっていません。 今後そのレベルで理解できるようになれるのかな?
- リンクを取得
- ×
- メール
- 他のアプリ
欠点検査コードができた。 画像ファイルのファイル名 KRGB107530G50は、白50%の中に白赤緑青の各100%70%50%30%の点が並べてある KRGB107530G90は、白90%の中に白赤緑青の各100%70%50%30%の点が並べてある という意味で作成しています。 白50%(透過光を想定)と白90%(反射光を想定)では、点が重ならないように、ずらしています。 画像データ0-255に変換されて、 白50%の中の白50%の点と、白90%の中の白100%の点以外は、赤四角で囲まれました。 from PIL import Image , ImageDraw import datetime # 画像を開く ut_now = datetime . datetime . now () print ( ut_now , 'ファイルを開く' ) im0 = Image . open ( "C:/code/py311/trial/KRGB107530G50.png" ) im1 = Image . open ( "C:/code/py311/trial/KRGB107530G90.png" ) # RGBそれぞれの平均値を算出 ut_now = datetime . datetime . now () print ( ut_now , '平均値算出0' ) r_sum0 , g_sum0 , b_sum0 = 0 , 0 , 0 pixels0 = im0 . load () for i in range ( im0 . size [ 0 ]): for j in range ( im0 . size [ 1 ]): r , g , b = pixels0 [ i , j ] r_sum0 += r g_sum0 += g b_sum0 += b num_pixels = im0 . size [ 0 ] * im0 . size [ 1 ] r_...