PythonでOpenCVを使用して、
画像に対して、四角い図形を高速で描画したく思います。
1枚に対して、四角い図形の描写は多数あり、
四角の位置はリスト化しているのですが、毎回画像へ四角を描写をfor文で使用しているせいか、
遅いです。
w_1_1=[〇] w_2_1=[〇] w_4=[〇] frame = imread("〇") for a in range(len(リスト)): cv2.putText(frame, w_1_1[a], (int(w4[a][0])+50, int(w4[a][1])-10),cv2.FONT_HERSHEY_PLAIN, 1.5,(181, 255, 20), 1, cv2.LINE_AA) frame=cv2.rectangle(frame, (int(w4[a][0])-10 ,int(w4[a][1])-10), (int(w4[a][2])+10, int(w4[a][3])+10), (181, 255, 20), 1) cv2.putText(frame, w_2_1[a], (int(w4[a][0])-10, int(w4[a][1])-10),cv2.FONT_HERSHEY_PLAIN, 1.5,(181, 255, 20), 1, cv2.LINE_AA) ```、 四角の位置リストは2次元リストで、w_1_1とw_2_1は書き込みたい文字リストです。 リストを一括でcv.rectangleへ出力すること、たとえば数行でfor文なしで送れたりできるのでしょうか。 それとも、GPUなんかを使用した方がよいのでしょうか? cv2.cuda等です。またはfor文以外で良い方法がありましたらご教示ください。 何卒、宜しくお願いいたします。
このループを含む関数かなにかがあるのだと思うのですが、その呼び出しにおいて、定数になる部分は存在しないのでしょうか?例えば呼び出しごとにテキストは変わっていないとか。そうしたらそれをキャッシュしてあげるという戦法が考えられます。なぜならテキストの描画というのは一般に低速だからです。
> リストを一括でcv.rectangleへ出力
cv2.polylines()
または
cv2.fillPoly()
を使うのは、いかがでしょうか?
https://biotech-lab.org/articles/1251#i-2
ありがとうございます。はい、rectangleだけでなく、多角形として四角を描画しても構いませんので、
こちらの意図と合っております。テキストはおっしゃる通り、ランダムといいますか、取得した数値によって変化します。テキストは2種類あり、AIで検出したラベルと、その数値です。
検出したラベルの種類は3種類あり、定数に近いと思いますが、数値はほぼ未知数です。
ですが、線の色等で数値を表現、文字に合わせた線色表現でも良いかもしれません。
ありがとうございます。試してみます。
ラベルが3種類しかないなら、使う文字数はそんなにないですよね
数値は、0〜9と小数点(とカンマ)しかないから、やはり文字数は限定されますよね
使う文字数がそんなにないなら、使いたい文字(数字含む)を予め多角形化しておいて、全部
cv2.polylines()
または
cv2.fillPoly()
で済ましてしまうとか
文字から(予め作っておいた)多角形を選んで当てはめるところはforループ回すことになるかもしれませんが、時間がかかっている原因がforループがあること自体ではなく、OpenCVの関数を何回も実行することにあるのなら、文字から多角形を作るforループがあっても、cv2.putTextの実行を無くせたら効果ありますよね
(あくまでも、効果は、どこで時間がかかってるのかによって変わりますけど)
理解力を深めるため、確認させてくだし。
cv2.putTextを使わず、文字も(英数字)多角形で書くということでしょうか?
とりあえず cv2.putText を無くしたら速度がまともになるのかどうかを確認してみれば良いですね.
ところで「多数」というのが何個くらいの話なのでしょうか?
それなりにOpenCVで可視化とかやってきましたが,描画処理が原因で遅いと感じたことはないので,興味があります.
(本当に速度に影響あるほどに大量だとしたら,描画結果はもう画像全体をぐちゃぐちゃに埋め尽くして結局目視できなそうな気が…)
150個くらいです。おっしゃる通り、個数より画像サイズの方が速度に依存します。
> cv2.putTextを使わず、文字も(英数字)多角形で書くということでしょうか?
この質問の解決に、cv2.putText()をループで何回も実行するのを無くすのが必須ならば、そうです
それが必須かどうかは、どこでどれだけ時間がかかってるのかを測らないと、分かりません
私は一つ前のコメントの最後にそう書いたし、fanaさんもそれ指摘してます
効果があまり無いところを頑張っても報われませんので、まずは処理個別に時間を測ることをお勧めします
全体の実行時間の内訳を把握して、どこ変えるか(どこ変えないのか)決めるのです
最適化は計測から始めよ、という格言もありますし、まずはどこが処理を重くしているのか正確に理解するべきです。
https://qiita.com/meshidenn/items/4dbde22d1e7a13a255bb
あなたの回答
tips
プレビュー