投稿

10月, 2023の投稿を表示しています
■細かな不具合修正 カメラが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_...
イメージ
 LEDテープ、本日入荷。動作に問題無し。 これで、加工前シートの検査用の動作チェックや、動作デモを行えるだけの部品が揃った。 Lepro LEDテープライト
イメージ
 この後、GIMPで欠点画像を作成し、 ・欠点検査コード部分の作成    欠点部分を強調し、四角枠で囲み、ファイル保存 ・欠点画像を使用した、画像表示を伴う検査プログラムの作成    欠点画像を表示、キー押しで、欠点部分を強調し、四角枠で囲み、画像更新 ・欠点を作った動作検証用シートの作成 ・画像撮影・更新まで進んだ本体プログラムへの、検査コードの組み込み    スライドバーでの検査感度設定の組み込み    処理時間を確認しながら、LEDのON/OFFタイミングを調整    などなど に進む予定。 LEDテープは1組しか購入していなかったが、やっと先が見えてきたので、もう1組発注。 Lepro LEDテープライト
 欠点検査コードの作成に取り掛かったはいいが、monicaに質問して出てきたプログラムは、検査動作確認用に用意した画像ファイルを読み込まないの件、原因判明。 VSCodeでは、次のコード部分には image_path = "c:\code\py311\Ta2S Inspection soft\image \" パス部分に波線チェックが入って、問題がある、 image_path = "c:/code/py311/Ta2S Inspection soft/image/" などに直す必要がある、とわかるが、 img = cv2 . imread ( 'C:\code\py311 \t rial\sheetD00.png' ) のパス部分にはチェックが入らず、動作させてエラーが出て???となり、 img = cv2 . imread ( 'C:/code/py311/trial/sheetD00.png' ) に直して動作するようになった。 デバッグの所に、 C :\ Users\tamta> と表示されているため、それを見て、monicaの回答を動作するように修正するときに、Windowsで使用できないバックスラッシュを使ってしまったためであった。 (コマンドプロンプトの表示もバックスラッシュ・・・何故なんだろ・・・) 他のOS機器とやり取りをすることもあるので、入力できることは当然必要なのだが・・・ OpenCVでのファイル読み書きもチェックしてほしいなー・・・ 判別が難しいのかなー・・・
  PySimpleGUI、画像更新時にwindow.Refresh()でウィンドゥの更新をすることにより、ちゃんと2回画像更新ができるようになりました。 また、window.Refresh()を使用することで、「1回目の撮影画像と2回目の撮影画像が上下に分かれて一体化した画像」は、1回目の撮影では発光していなかったための勘違いと気づきました。 LED発光安定化のための待ち時間が、次の発光までに時間が空くと長く必要になり、短時間に繰り返し発光すると短くなる傾向があるようで、 2秒=足りないことが多々発生、3秒=若干足りない時がある、4秒=安定化OK であったための勘違いでした。 撮影中に発光が始まり、画像を合成したように見えていた、見誤りでした。 アナログリレーで制御しているため、ある程度の遅れは考慮していましたが、LEDに調光器をつけているため若干の電流制限が起きて発光が更に遅れた、ということでしょうか。 これで、 起動中画面の文字表示の問題と、画像更新の問題が、論理的に解決でき、LED発光安定化が確実にできるようになりました。 しかし、4秒ものLED発光安定化時間が必要なので、発光のタイミングをどうするか、透過光検査の時だけ上からの照射を止める、撮影前に次の撮影用のLED ONを指示するような、時短テクニックが必要なようです。 なんとリスキーな・・・
 PySimpleGUIで作成していた方、PySimpleGUIにもTkinterのroot.update()と同じような画面を即時更新できるコマンドがあるのではないかと調査。 monicaに画面更新できるコマンド5個を質問すると、次があるとの回答 1.window.Refresh(): ウィンドウを再描画します。 2.window.Read(timeout=0): イベントループを再開し、ウィンドウの更新を行います。 3.window.FindElement(key).Update(value): 指定したキーに対応する要素の値を更新します。 4.window.FindElement(key).Update(disabled=True): 指定したキーに対応する要素を無効化します。 5.window.FindElement(key).Update(visible=True): 指定したキーに対応する要素を表示します。 起動中画面の文字がwindow.Readで表示されるようになったのは、ウィンドウの更新を行う効果だったか。 window.Refresh()でウィンドウを再描画すれば、改善しそう。
 欠点検査コードの作成に取り掛かったはいいが、monicaに質問して出てきたプログラムは、検査動作確認用に用意した画像ファイルを読み込まない。 最近の1ヶ月はメモリ内で処理させようとしていたので、ファイル読み込みのコードを全く忘れてしまっており、愕然とした。 繰り返し使用していないので、全然身についていない。 なんか10時なのに眠たくなってきた。年には勝てないということか。
  Tkinterを使用したタイプ、 teratail で質問した結果、 起動中画面を表示して、初期設定を行った後、起動中画面を消し、プログラム本体に進みたい。 教えていただいたroot.update_idletasks()とは何か、調べていると root.update()で画面を即時更新できる、との情報に行きつき、試してみると、表示できました。 開発中のプログラムに適用しても、起動中ウィンドゥを表示・正常に動作するようになりました。 Tkinterでプログラム本体を組むのは気が重く、PySimpleGUIの方は回答がついていないので少し待ちたい、ということで、欠点検査コードの作成に取り掛かる。
 Tkinterを使用したタイプ、まずは 「検査ソフト起動中」の画面を表示しながら 初期設定を行なう方法、動画を見てもよくわからない。 monicaで、PySimpleGUIからTkinterに変換してもらえるんじゃない?と思い、チャレンジ。 いろいろ質問してみたが、 ・「検査ソフト起動中」の画面が表示されないまま、初期設定に進む ・「検査ソフト起動中」の画面が表示されるが、その画面が消えてから初期設定が始まる のどちらかしかできない。 Web検索してみたが、参考例が見つからない。 (今の私には全く実現できそうにないコメント的な情報はあったように思うのだが・・・) root.mainloop()を使用しない表示方法が、まったくわからないので、あきらめた。 もう完全に自分の手に余ると判断し、 teratail で質問した。 起動中画面を表示して、初期設定を行った後、起動中画面を消し、プログラム本体に進みたい。 気になって見てしまうと、閲覧数が加算されてしまう。 でもメール通知が待ちどうしい。 誰か答えてくれるかな。
  asynciowoを使用しても改善しなかったため、もう完全に自分の手に余ると判断し、 teratail で質問した。 USBカメラで2回写真撮影し、撮影毎に進捗がわかるよう、表示画像を2回更新したい 45閲覧がついてて、ブラウザ更新すると、閲覧数がどんどん増えていく。 が~ん!気になって見ていたら、自分の閲覧で閲覧数が増えていたとは・・・
monicaに質問すると、次の様な結果が返ってきたので、 Pythonで、time.sleep(5)の代わりに、処理を止めずに、5秒処理待ちするコードを教えてください。 Pythonで処理を5秒待つために、time.sleep(5)の代わりに次のコードを使用できます。 import asyncio async def wait():     await asyncio.sleep(5) asyncio.run(wait()) このコードは非同期処理を使用しており、await asyncio.sleep(5)によって5秒間の待機が行われます。 処理はブロックされずに継続されるため、他のタスクを同時に実行できます。 asyncioを使用した処理を更に質問し、次の様な簡単に記述できそうなコードを試行錯誤してチェックを行い、 import asyncio # 1 ################################################### async def wait ():     await asyncio . sleep ( 1 )     print ( "Waited for 1 second" ) async def main ():     await wait ()     # ここに他の処理を追加できます     await wait () asyncio . run ( main ()) asyncio . run ( main ()) asyncio . run ( main ()) # 2 ################################################### # 処理待ち関数の定義 async def wait ():     await asyncio . sleep ( 1 )     print ( "Waited for 1.0 second" ) async def main1 (): # 1秒待ち     await wait () async def main2 (): ...
Pythonでプログラミングをしようと決めるきっかけをくれた、 Pythonプログラミング VTuber サプー さんのYouTubeをまた視聴しました。 【Pythonプログラミング入門】自作のデスクトップアプリを作る!Tkinterで簡単!〜VTuberと学習〜 【初心者向け】 やはり難しい。 【Tkinter 第2弾】10種類のウィジェット解説!Pythonでデスクトップアプリを作れるTkinterを使いこなそう! 〜 初心者向け 〜 プログラミング入門 仕事帰りでは、眠たくなって視聴が進まない。 PySimpleGUIだって使っている人が多いから、紹介してくれているはず。 Pythonでデスクトップアプリを作成!PySimpleGUI編 【Pythonプログラミング 初心者向け】 もう少し、PySimpleGUIでのプログラミングをチャレンジしてみようと、調べていると、 PySimpleGUIで表示する文字が更新されるタイミングについて この返答の、 イベントループは、ユーザ操作や描画の更新等 GUIの基本挙動に関わる処理を継続的に行っているので、 その合間に呼ばれるイベントハンドラは即座に終了して、 イベントループ側に処理を戻さなければなりません。 と、 time.sleep の間はGUIが応答なしになっているはずです。 より、自分のプログラミングに問題があると思い直し、PySimpleGUIのプログラムを 見直してみることにした。
 いろいろトラブルが発生するが、もしかして自分の環境の問題かと思い、 これをクリアできるようにしておけば、大抵の環境に対応できると思って進めていたが... 自分の環境のWindows11の問題 ・ログイン画面に4つの選択肢が表示される    アドミニストレーター    最初に設定したユーザー(Microsoft以外のメールアドレス)    自動ログイン設定に失敗して放置したユーザー    Microsoftアカウントユーザー(Microsoftアカウント取得で勝手に追加された) ・ログイン時に前回開いていた複数のエクスプローラーを表示できない    いろいろ設定して一時的に表示できていた時もあるが、    WindowsUpdateですべての設定が無駄になるので、諦めた。 ・エクスプローラーでのファイル・フォルダ名変更・確定で、再度変更状態になる    変更した名より右側をクリックして確定させようとすると、再度変更状態になる。    他の名等をクリックすると回避できるが、勝手に並べ替えるので、    ファイル・フォルダが多いと、変更したファイル・フォルダを探し回るはめになる。 ・エクスプローラーの更新が度々起こるので、ファイル・フォルダを探し回るはめになる。    検索画面を勝手に更新されるのは、つらい。 ひょっとしたら、自分の環境と、PySimpleGUIとの相性が悪い等があるのではないかと思いつき、初心に帰って標準のTkinterでGUIを構築してみることにした。 Class、def、__init__、等に拒否感が出て、まだ理解しやすいPySimpleGUIに逃げていたのだが、SEになるつもりはないので、今ならまねっこぐらいはできるはず。
 今日気づいたのだが、   統計情報    自分のページビューの追跡を管理     □このブログの自分のビューを追跡しない にチェックを入れていないと、 自分がブラウザで表示状態を確認した分も、 アクセスカウントされていたのでは... もう少しわかりやすい所に、設置しておいて欲しかった... スマホで確認する分は、どうしようもないか...