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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

3775閲覧

Opencv cv2.lineがでてこない。

Cielwoo

総合スコア11

OpenCV

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

Python 3.x

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

0グッド

0クリップ

投稿2017/11/13 07:23

今opencvを使って線を表したいのですができません。言語はpython3です。
3重配列の要素を繋げたいのですがエラーはでないのに動画を再生すると
線が出て来ますせん。どこがいけないのでしょうか?
求めている結果はこんな感じです。
イメージ説明
そして下がコードです。

def route(n_id): if(len(n_id) > 1): for i in range(1,len(n_id)): for a in range(0,len(n_id[i])): if(len(n_id[i][a]) > 2): cv2.line(frame,(n_id[i][a][0],n_id[i][a][1]),(n_id[i][a+1][0],n_id[i][a+1][1]),(0,20,255),2)

配列はこんな感じで座標が保存されて行きます。
イメージ説明

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

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

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

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

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

can110

2017/11/13 07:41

3重配列の各要素やコード上の各ループの説明、またできれば単純なデータ例を示すと回答得られやすいかと思います。
Cielwoo

2017/11/13 08:13

配列の各要素はまず、認識した物体の座標であり、同じ物体の座標を蓄積しています。そしてループは、蓄積された座標を一つ一つ処理するためのものです。最初の[0,0]は無視して結構です。
can110

2017/11/13 08:19

n_id[i][a][0]の[i],[a],[0]or[1]は何を表しているのか、また表示データも「どんな順番で何を出力」しているのかが不明です。
Cielwoo

2017/11/13 09:04

n_id [各物体] [物体の座標群] [座様(a,b)]こんな感じです。表示データは[ [[ ]], [[ ]], [[ ]] ] -> [[ ]]は一つの物体の座標群でしす。座標は順番ずつ入って行きます。表示データは配列の中身を見せるためにアップしました。
guest

回答1

0

ベストアンサー

具体的な元データ配列構造がいまひとつ理解できていないかもしれませんが、以下のような感じで描画できないでしょうか?
分かりやすさを優先し、あえて冗長なコードとしています。

Python

1import cv2 2import numpy as np 3(W,H) = (640,480) 4img = np.zeros((H,W,3), np.uint8) # 幅640x高さ480 5 6# [物体][点群][xory座標] 7n_id = np.array( 8 [[[100,100],[100,300],[200,300],[200,100]], 9 [ [300,200],[300,300],[400,300],[400,200]], 10 [ [500,300],[500,400],[600,400],[600,300]]]) 11 12for obj_idx in range(len(n_id)): # 物体毎 13 obj = n_id[obj_idx] # 1物体(領域) 14 for pt_idx in range(len(obj)): # 領域を構成する点群毎 15 pt_st = obj[pt_idx] # 始点 [0]=x, [1]=y 座標 16 17 # 最後は最初の点と結ぶ 18 pt_idx += 1 19 if pt_idx >= len(obj): 20 pt_idx = 0 21 22 pt_ed = obj[pt_idx] # 終点 23 24 # 始点→終点へ赤線を引く 25 cv2.line(img, (pt_st[0],pt_st[1]), (pt_ed[0],pt_ed[1]), (0, 0, 255), obj_idx+1) 26 27cv2.namedWindow("img") 28cv2.imshow("img", img) 29cv2.waitKey(0) 30cv2.destroyAllWindows()

イメージ説明

投稿2017/11/13 09:16

can110

総合スコア38266

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

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

Cielwoo

2017/11/13 09:25

線が出て来ました! でも、これを最初と最後の点を結ばないとしたらどうすればいいですか?
can110

2017/11/13 10:53

よかったです。 >これを最初と最後の点を結ばないとしたらどうすればいいですか? 最初と最後の点を結ぶ線は最後に引いているので、点群のループを1回少なくすればよいです。
Cielwoo

2017/11/28 12:37

だいぶ時間が経っていますが、そのコードでfor文を降順でやるにはどうすればよいでしょうか? reverseを使ってみたのですができません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問