質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

Q&A

0回答

1863閲覧

OPENCV 画像に図形を高速で描画する

goki_gottan

総合スコア168

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

0グッド

0クリップ

投稿2021/06/04 10:08

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文以外で良い方法がありましたらご教示ください。 何卒、宜しくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2021/06/04 12:20 編集

このループを含む関数かなにかがあるのだと思うのですが、その呼び出しにおいて、定数になる部分は存在しないのでしょうか?例えば呼び出しごとにテキストは変わっていないとか。そうしたらそれをキャッシュしてあげるという戦法が考えられます。なぜならテキストの描画というのは一般に低速だからです。
goki_gottan

2021/06/07 00:06

ありがとうございます。はい、rectangleだけでなく、多角形として四角を描画しても構いませんので、 こちらの意図と合っております。テキストはおっしゃる通り、ランダムといいますか、取得した数値によって変化します。テキストは2種類あり、AIで検出したラベルと、その数値です。 検出したラベルの種類は3種類あり、定数に近いと思いますが、数値はほぼ未知数です。 ですが、線の色等で数値を表現、文字に合わせた線色表現でも良いかもしれません。 ありがとうございます。試してみます。
jbpb0

2021/06/07 00:30 編集

ラベルが3種類しかないなら、使う文字数はそんなにないですよね 数値は、0〜9と小数点(とカンマ)しかないから、やはり文字数は限定されますよね 使う文字数がそんなにないなら、使いたい文字(数字含む)を予め多角形化しておいて、全部 cv2.polylines() または cv2.fillPoly() で済ましてしまうとか 文字から(予め作っておいた)多角形を選んで当てはめるところはforループ回すことになるかもしれませんが、時間がかかっている原因がforループがあること自体ではなく、OpenCVの関数を何回も実行することにあるのなら、文字から多角形を作るforループがあっても、cv2.putTextの実行を無くせたら効果ありますよね (あくまでも、効果は、どこで時間がかかってるのかによって変わりますけど)
goki_gottan

2021/06/07 01:03

理解力を深めるため、確認させてくだし。 cv2.putTextを使わず、文字も(英数字)多角形で書くということでしょうか?
fana

2021/06/07 01:07

とりあえず cv2.putText を無くしたら速度がまともになるのかどうかを確認してみれば良いですね. ところで「多数」というのが何個くらいの話なのでしょうか? それなりにOpenCVで可視化とかやってきましたが,描画処理が原因で遅いと感じたことはないので,興味があります. (本当に速度に影響あるほどに大量だとしたら,描画結果はもう画像全体をぐちゃぐちゃに埋め尽くして結局目視できなそうな気が…)
goki_gottan

2021/06/07 01:13

150個くらいです。おっしゃる通り、個数より画像サイズの方が速度に依存します。
jbpb0

2021/06/07 01:19 編集

> cv2.putTextを使わず、文字も(英数字)多角形で書くということでしょうか? この質問の解決に、cv2.putText()をループで何回も実行するのを無くすのが必須ならば、そうです それが必須かどうかは、どこでどれだけ時間がかかってるのかを測らないと、分かりません 私は一つ前のコメントの最後にそう書いたし、fanaさんもそれ指摘してます 効果があまり無いところを頑張っても報われませんので、まずは処理個別に時間を測ることをお勧めします 全体の実行時間の内訳を把握して、どこ変えるか(どこ変えないのか)決めるのです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問