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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

926閲覧

python opencv サークルを2つ表示させたい

0126tami

総合スコア60

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/23 05:44

編集2020/01/23 06:16

イメージ説明
イメージ説明

このように二人のx座標y座標から選手位置を特定しようとしています

しかし1つしか下の画像の選手位置(サークル)が表示されないのを2つ表示されるように変更したいです

コードでいうと内外判定 circle関数のところです
ご協力お願いいたします

import cv2 import numpy as np from matplotlib import pyplot as plt src= cv2.imread("himae01.png") cv2.imshow("z",src) #ユニフォーム抽出 dst1 = cv2.inRange(src, (3,5,50), (40,40,190)) dst2 = cv2.blur(dst1, ksize=(5,5)) ret,thresh1 = cv2.threshold(dst2,127,255,cv2.THRESH_BINARY) cv2.imshow("b",thresh1) cv2.imwrite("hi01heikatu.png",dst2) cv2.imwrite("hi01nichika.png",thresh1) # ラベリング処理(x座標) label = cv2.connectedComponentsWithStats(thresh1) stats = label[2] area = stats[:, cv2.CC_STAT_WIDTH] * stats[:, cv2.CC_STAT_HEIGHT] top2_idx = area.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) # オブジェクト情報を項目別に抽出 data = label[2] center = label[3] # ラベリング結果書き出し用に二値画像をカラー変換 color_src = cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR) # オブジェクト情報を利用してラベリング結果を表示 lst_pos = [] for i in top2_idx: # 各オブジェクトの外接矩形を赤枠で表示 x0 = data[i][0] y0 = data[i][1] x1 = data[i][0] + data[i][2] y1 = data[i][1] + data[i][3] cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 0, 255)) # 各オブジェクトの重心座標をに黄文字で表示 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1 - 10, y1 + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) cv2.putText(color_src, "Y: " + str(int(center[i][1])), (x1 - 10, y1 + 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) # 追加コード: 重心座標を書き出す # img = thresh1[y0:y1,x0:x1] # lst_pos.append((y0,y1,x0,x1,int(center[i][0]))) lst_pos.append((int(center[i][0]),int(center[i][1]))) # x座標の位置 cv2.imshow('x',color_src) #「背景」となる画像の取り込み(グレースケール) img_src01 = cv2.imread("highmae000.png", 0) #「差分」をもった画像の取り込み(グレースケール) img_src02 = cv2.imread("himae01.png", 0) #「背景差分」計算用オブジェクトの作成  bgObj = cv2.bgsegm.createBackgroundSubtractorMOG() # 修正点: ただただ手元のOpenCVでエラーが出ないようにするための目的で変更。 #bgObj = cv2.createBackgroundSubtractorMOG2() #差分となっている「前景領域」に対してマスクをかける fgmask = bgObj.apply(img_src01) fgmask = bgObj.apply(img_src02) cv2.imwrite("hi01haikei.png",fgmask) kernel = np.ones((3, 3), np.uint8) # 膨張・収縮処理(方法2) erode= cv2.erode(fgmask,kernel) dilate = cv2.dilate(erode, kernel) # ラベリング処理(y座標) label2 = cv2.connectedComponentsWithStats(dilate) ### 追加した部分1 stats2 = label2[2] area2 = stats2[:, cv2.CC_STAT_WIDTH] * stats2[:, cv2.CC_STAT_HEIGHT] top2_idx2 = area2.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) # オブジェクト情報を項目別に抽出 data2 = label2[2] center2 = label2[3] # ラベリング結果書き出し用に二値画像をカラー変換 color_src2 = cv2.cvtColor(dilate, cv2.COLOR_GRAY2BGR) # 追加コード: 適当に追加 img_col = cv2.imread("highmae000.png") coat = cv2.inRange(img_col, (20,60,40), (100,100,90)) # オブジェクト情報を利用してラベリング結果を表示 for i in top2_idx2: # 各オブジェクトの外接矩形を赤枠で表示 x0 = data2[i][0] y0 = data2[i][1] x1 = data2[i][0] + data2[i][2] y1 = data2[i][1] + data2[i][3] cv2.rectangle(color_src2, (x0, y0), (x1, y1), (0, 0, 255)) # 各オブジェクトの重心座標をに黄文字で表示 cv2.putText(color_src2, "Y: " + str(int(y1)), (x1 - 10, y1 + 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) ############################################## # 内外判定 poly = np.array([[int(x0),int(y0)], [int(x0),int(y1)], [int(x1),int(y1)], [int(x1),int(y0)]]) for j in range(len(lst_pos)): if cv2.pointPolygonTest( poly, lst_pos[j], False)== 1: # print("in") # 青で描画 coat = cv2.circle(coat,(lst_pos[j][0],y1), 5, (255,0,0), -1) # else: # print("out") ############################################## cv2.imshow('coat',coat) cv2.imwrite("himae01coat.png",coat) cv2.imshow('y',color_src2) cv2.imwrite("himae01y.png",color_src2) # 変換前後の対応点を設 p_original = np.float32([[179,102], [366,119], [22, 396], [501, 413]]) p_trans = np.float32([[0,0], [610,0], [0,1340], [610,1340]]) # 変換マトリクスと射影変換 M = cv2.getPerspectiveTransform(p_original, p_trans) i_trans = cv2.warpPerspective(coat, M, (610, 1340)) #ここからグラフ設定 fig = plt.figure() ax1 = fig.add_subplot(111) # 画像をプロット show = cv2.cvtColor(i_trans, cv2.COLOR_BGR2RGB) ax1.imshow(show) fig.tight_layout() plt.show() plt.close() cv2.waitKey(0) cv2.destroyAllWindows()

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

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

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

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

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

tiitoi

2020/01/23 06:00

> 1つしか選手位置が表示されないのを2つ表示されるように変更したいです すでに2つ表示されていないでしょうか? # 各オブジェクトの重心座標をに黄文字で表示 の下の行に Y 座標を描画するコードがあり、そのコード通り、それぞれの矩形の Y 座標が表示されているように見えます。 上の矩形のYの文字は白の背景にかぶってるため、見えづらいですが、よく見ると Y と左にかかれています。
0126tami

2020/01/23 06:15

説明がわかりずらくてすみません 上の画像を元にしたの下の画像にサークル(選手位置の目印)を2つ作りたいのです
tiitoi

2020/01/23 06:21 編集

そうであれば、for ループ内の (x0, y0), (x1, y1) が上の画像で赤で囲われている矩形の左上と右下の座標なので、例えば、その中心とかをそのまま下の画像に cv2.circle() で描画すればいいのではないでしょうか
guest

回答1

0

自己解決

自主的に解決した

投稿2020/01/23 15:23

0126tami

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問