🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

Python

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

Q&A

解決済

1回答

5460閲覧

2つの値を元に画像上にプロットする python opencv

0126tami

総合スコア60

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/01/03 07:03

編集2020/01/25 08:04

この画像にプログラムに書かれているラベリング処理を2回した時に求めた
x座標とy座標の値を赤い点として表示させたいです

赤い点と書いてありますが
わかりやすくばつ印などでも良いです

!!!!!!下記のビックリマークのところをどう直せば良いか!!!!!!!!
教えてください

import cv2 import numpy as np from matplotlib import pyplot as plt src= cv2.imread("kuro1.png") #ユニフォーム抽出 dst1 = cv2.inRange(src, (3,3,3), (10,8,10)) dst2 = cv2.blur(dst1, ksize=(5,5)) ret,thresh1 = cv2.threshold(dst2,127,255,cv2.THRESH_BINARY) # ラベリング処理(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) # オブジェクト情報を利用してラベリング結果を表示 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.imshow('x',color_src) #「背景」となる画像の取り込み(グレースケール) img_src01 = cv2.imread("zero1.png", 0) #「差分」をもった画像の取り込み(グレースケール) img_src02 = cv2.imread("kuro1.png", 0) #「背景差分」計算用オブジェクトの作成  bgObj = cv2.bgsegm.createBackgroundSubtractorMOG() #差分となっている「前景領域」に対してマスクをかける fgmask = bgObj.apply(img_src01) fgmask = bgObj.apply(img_src02) # ラベリング処理(y座標) label2 = cv2.connectedComponentsWithStats(fgmask) ### 追加した部分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(fgmask, cv2.COLOR_GRAY2BGR) # オブジェクト情報を利用してラベリング結果を表示 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)) cv2.imshow('y',color_src2) この下からコートの画像に値を点で表したい!!!!!!!!!!!!!!! midori=cv2.imread("coat2.png") !!!!!!!!!!!新たにここを追加!!!!!!!!!! この座標部分をどう直したら良いかがわかりません!!!!!!!!!!! color_src3 = cv2.cvtColor(coat, cv2.COLOR_GRAY2BGR) coat3=cv2.circle(color_src3,(int(center[i][0]),int(top2_idx2(y1))), 63, (0,0,255), -1) cv2.waitKey(0) cv2.destroyAllWindows()

上記の2箇所のラベリング処理の部分のputtextでx座標とy座標を渡しているので
その値を新たな zero1.pngの画像に点として表示したいです

そして
このようなエラーが出ました

coat3=cv2.circle(color_src3,(int(center[i][0]),int(top2_idx2(y1))), 63, (0,0,255), -1) IndexError: index 11 is out of bounds for axis 0 with size 6

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

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

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

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

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

guest

回答1

0

ベストアンサー

2020-01-05追補2
上--(重心X,矩形Y)、下--根拠
上 (重心X,矩形Y)を青丸で表示
下 根拠を図示

Python3

1import cv2 2import numpy as np 3from matplotlib import pyplot as plt 4 5 6 7src= cv2.imread("kuro1.png") 8 9 10 11#ユニフォーム抽出 12dst1 = cv2.inRange(src, (3,3,3), (10,8,10)) 13dst2 = cv2.blur(dst1, ksize=(5,5)) 14ret,thresh1 = cv2.threshold(dst2,127,255,cv2.THRESH_BINARY) 15 16# ラベリング処理(x座標) 17label = cv2.connectedComponentsWithStats(thresh1) 18 19stats = label[2] 20area = stats[:, cv2.CC_STAT_WIDTH] * stats[:, cv2.CC_STAT_HEIGHT] 21top2_idx = area.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) 22 23# オブジェクト情報を項目別に抽出 24data = label[2] 25center = label[3] 26 27# ラベリング結果書き出し用に二値画像をカラー変換 28color_src = cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR) 29 30# オブジェクト情報を利用してラベリング結果を表示 31lst_pos = [] 32for i in top2_idx: 33 # 各オブジェクトの外接矩形を赤枠で表示 34 x0 = data[i][0] 35 y0 = data[i][1] 36 x1 = data[i][0] + data[i][2] 37 y1 = data[i][1] + data[i][3] 38 cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 0, 255)) 39 40 # 各オブジェクトの重心座標をに黄文字で表示 41 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1 - 10, y1 + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) 42 43 # 追加コード: 重心座標を書き出す 44 # img = thresh1[y0:y1,x0:x1] 45 # lst_pos.append((y0,y1,x0,x1,int(center[i][0]))) 46 lst_pos.append((int(center[i][0]),int(center[i][1]))) 47 48 49# x座標の位置 50cv2.imshow('x',color_src) 51 52#「背景」となる画像の取り込み(グレースケール) 53img_src01 = cv2.imread("zero1.png", 0) 54 55#「差分」をもった画像の取り込み(グレースケール) 56img_src02 = cv2.imread("kuro1.png", 0) 57 58#「背景差分」計算用オブジェクトの作成  59# bgObj = cv2.bgsegm.createBackgroundSubtractorMOG() 60# 修正点: ただただ手元のOpenCVでエラーが出ないようにするための目的で変更。 61bgObj = cv2.createBackgroundSubtractorMOG2() 62 63#差分となっている「前景領域」に対してマスクをかける 64fgmask = bgObj.apply(img_src01) 65fgmask = bgObj.apply(img_src02) 66 67# ラベリング処理(y座標) 68label2 = cv2.connectedComponentsWithStats(fgmask) 69 70### 追加した部分1 71stats2 = label2[2] 72area2 = stats2[:, cv2.CC_STAT_WIDTH] * stats2[:, cv2.CC_STAT_HEIGHT] 73top2_idx2 = area2.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) 74 75# オブジェクト情報を項目別に抽出 76data2 = label2[2] 77center2 = label2[3] 78 79# ラベリング結果書き出し用に二値画像をカラー変換 80color_src2 = cv2.cvtColor(fgmask, cv2.COLOR_GRAY2BGR) 81 82# 追加コード: 適当に追加 83img_col = cv2.imread("zero1.png") 84 85# オブジェクト情報を利用してラベリング結果を表示 86for i in top2_idx2: 87 # 各オブジェクトの外接矩形を赤枠で表示 88 x0 = data2[i][0] 89 y0 = data2[i][1] 90 x1 = data2[i][0] + data2[i][2] 91 y1 = data2[i][1] + data2[i][3] 92 cv2.rectangle(color_src2, (x0, y0), (x1, y1), (0, 0, 255)) 93 94 # 各オブジェクトの重心座標をに黄文字で表示 95 cv2.putText(color_src2, "Y: " + str(int(y1)), (x1 - 10, y1 + 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) 96 97 ############################################## 98 # 内外判定 99 poly = np.array([[int(x0),int(y0)], [int(x0),int(y1)], [int(x1),int(y1)], [int(x1),int(y0)]]) 100 for j in range(len(lst_pos)): 101 102 if cv2.pointPolygonTest( poly, lst_pos[j], False)== 1: 103 # print("in") 104 # 青で描画 105 img_col = cv2.circle(img_col,(lst_pos[j][0],y1), 10, (255,0,0), 2) 106 # else: 107 # print("out") 108 ############################################## 109 110cv2.imshow('img_col',img_col) 111 112cv2.imshow('y',color_src2) 113## 114## 115### この下からコートの画像に値を点で表したい!!!!!!!!!!!!!!! 116## 117##midori=cv2.imread("coat2.png") 118## 119### !!!!!!!!!!!新たにここを追加!!!!!!!!!! 120### この座標部分をどう直したら良いかがわかりません!!!!!!!!!!! 121## 122## 123### 変更点: coatが未定義のため適当に変更 124### color_src3 = cv2.cvtColor(coat, cv2.COLOR_GRAY2BGR) 125### coat3=cv2.circle(color_src3,(int(center[i][0]),int(top2_idx2(y1))), 63, (0,0,255), -1) 126## 127### 変更点: 画像を適当に読み込み 128### img_col = cv2.imread("zero1.png") 129##img_col2 = img_col.copy() 130## 131### 変更点: Centerを赤で描画 132##for i in range(len(center)): 133## img_col2 = cv2.circle(img_col2,(int(center[i][0]),int(center[i][1])), 3, (0,0,255), -1) 134## 135## 136### 変更点: 矩形の頂点を緑で描画 137##for i in top2_idx2: 138## x0 = data2[i][0] 139## y0 = data2[i][1] 140## x1 = data2[i][0] + data2[i][2] 141## y1 = data2[i][1] + data2[i][3] 142## img_col2 = cv2.circle(img_col2,(int(x0),int(y0)), 3, (0,255,0), -1) 143## img_col2 = cv2.circle(img_col2,(int(x0),int(y1)), 3, (0,255,0), -1) 144## img_col2 = cv2.circle(img_col2,(int(x1),int(y0)), 3, (0,255,0), -1) 145## img_col2 = cv2.circle(img_col2,(int(x1),int(y1)), 3, (0,255,0), -1) 146## 147### cv2.imshow("img_col",img_col) 148## 149### 変更点: Centerのデバグ用 150##img_merged = cv2.addWeighted(img_col2, 0.8, color_src, 0.2, 0) 151##cv2.imshow("img_merged",img_merged) 152 153cv2.imwrite("img_col2_merged.png",np.vstack((img_col,img_merged))) 154cv2.waitKey(0) 155cv2.destroyAllWindows() 156

2020-01-05追補1

この画像にプログラムに書かれているラベリング処理を2回した時に求めた
x座標とy座標の値を赤い点として表示させたいです

赤い点と書いてありますがわかりやすくばつ印などでも良いです

プログラム全体の意図が良く掴めていませんが、「座標をプロットする」という点において、希望箇所(!!!の辺り)に対応コードを追加したため、これで解決できると思います。

また、赤い点、とありますが、Centerと矩形と両方とも位置を示すラベルと思いますので、色を分けて表示させました。
※OpenCVで描画する際にバツより丸の方が実装しやすいため丸で実装しています。

座標追加イメージ
赤: Center
緑: 矩形の頂点

コメントの

for i in top2_idx2の部分を
jに変えてみることで解決したりするのでしょうか?

については、今回は二重ループの出番がないので使用していません。
二重ループでiとは別の変数を使いたいときにjの出番があります。

今回は!!!の部分にfor文を追加しましたが、ラベル作成時にこの処理もまとめてやってしまった方がfor文が少なくなりますので、より早くそして、バグの発生する余地の少ないコードになると思います。

Python3

1import cv2 2import numpy as np 3from matplotlib import pyplot as plt 4 5src= cv2.imread("kuro1.png") 6 7#ユニフォーム抽出 8dst1 = cv2.inRange(src, (3,3,3), (10,8,10)) 9dst2 = cv2.blur(dst1, ksize=(5,5)) 10ret,thresh1 = cv2.threshold(dst2,127,255,cv2.THRESH_BINARY) 11 12# ラベリング処理(x座標) 13label = cv2.connectedComponentsWithStats(thresh1) 14 15stats = label[2] 16area = stats[:, cv2.CC_STAT_WIDTH] * stats[:, cv2.CC_STAT_HEIGHT] 17top2_idx = area.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) 18 19# オブジェクト情報を項目別に抽出 20data = label[2] 21center = label[3] 22 23# ラベリング結果書き出し用に二値画像をカラー変換 24color_src = cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR) 25 26# オブジェクト情報を利用してラベリング結果を表示 27for i in top2_idx: 28 # 各オブジェクトの外接矩形を赤枠で表示 29 x0 = data[i][0] 30 y0 = data[i][1] 31 x1 = data[i][0] + data[i][2] 32 y1 = data[i][1] + data[i][3] 33 cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 0, 255)) 34 35 # 各オブジェクトの重心座標をに黄文字で表示 36 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1 - 10, y1 + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) 37 38cv2.imshow('x',color_src) 39 40#「背景」となる画像の取り込み(グレースケール) 41img_src01 = cv2.imread("zero1.png", 0) 42 43#「差分」をもった画像の取り込み(グレースケール) 44img_src02 = cv2.imread("kuro1.png", 0) 45 46#「背景差分」計算用オブジェクトの作成  47# bgObj = cv2.bgsegm.createBackgroundSubtractorMOG() 48# 修正点: ただただ手元のOpenCVでエラーが出ないようにするための目的で変更。 49bgObj = cv2.createBackgroundSubtractorMOG2() 50 51#差分となっている「前景領域」に対してマスクをかける 52fgmask = bgObj.apply(img_src01) 53fgmask = bgObj.apply(img_src02) 54 55# ラベリング処理(y座標) 56label2 = cv2.connectedComponentsWithStats(fgmask) 57 58### 追加した部分1 59stats2 = label2[2] 60area2 = stats2[:, cv2.CC_STAT_WIDTH] * stats2[:, cv2.CC_STAT_HEIGHT] 61top2_idx2 = area2.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) 62 63# オブジェクト情報を項目別に抽出 64data2 = label2[2] 65center2 = label2[3] 66 67# ラベリング結果書き出し用に二値画像をカラー変換 68color_src2 = cv2.cvtColor(fgmask, cv2.COLOR_GRAY2BGR) 69 70# オブジェクト情報を利用してラベリング結果を表示 71for i in top2_idx2: 72 # 各オブジェクトの外接矩形を赤枠で表示 73 x0 = data2[i][0] 74 y0 = data2[i][1] 75 x1 = data2[i][0] + data2[i][2] 76 y1 = data2[i][1] + data2[i][3] 77 cv2.rectangle(color_src2, (x0, y0), (x1, y1), (0, 0, 255)) 78 79 # 各オブジェクトの重心座標をに黄文字で表示 80 cv2.putText(color_src2, "Y: " + str(int(y1)), (x1 - 10, y1 + 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) 81 82cv2.imshow('y',color_src2) 83 84 85# この下からコートの画像に値を点で表したい!!!!!!!!!!!!!!! 86 87midori=cv2.imread("coat2.png") 88 89# !!!!!!!!!!!新たにここを追加!!!!!!!!!! 90# この座標部分をどう直したら良いかがわかりません!!!!!!!!!!! 91 92 93# 変更点: coatが未定義のため適当に変更 94# color_src3 = cv2.cvtColor(coat, cv2.COLOR_GRAY2BGR) 95# coat3=cv2.circle(color_src3,(int(center[i][0]),int(top2_idx2(y1))), 63, (0,0,255), -1) 96 97# 変更点: 画像を適当に読み込み 98img_col = cv2.imread("zero1.png") 99 100# 変更点: Centerを赤で描画 101for i in range(len(center)): 102 img_col = cv2.circle(img_col,(int(center[i][0]),int(center[i][1])), 3, (0,0,255), -1) 103 104 105# 変更点: 矩形の頂点を緑で描画 106for i in top2_idx2: 107 x0 = data2[i][0] 108 y0 = data2[i][1] 109 x1 = data2[i][0] + data2[i][2] 110 y1 = data2[i][1] + data2[i][3] 111 img_col = cv2.circle(img_col,(int(x0),int(y0)), 3, (0,255,0), -1) 112 img_col = cv2.circle(img_col,(int(x0),int(y1)), 3, (0,255,0), -1) 113 img_col = cv2.circle(img_col,(int(x1),int(y0)), 3, (0,255,0), -1) 114 img_col = cv2.circle(img_col,(int(x1),int(y1)), 3, (0,255,0), -1) 115 116cv2.imshow("img_col",img_col) 117 118# 変更点: Centerのデバグ用 119# img_merged = cv2.addWeighted(img_col, 0.8, color_src, 0.2, 0) 120# cv2.imshow("img_merged",img_merged) 121 122cv2.waitKey(0) 123cv2.destroyAllWindows()

上記の2箇所のラベリング処理の部分のputtextでx座標とy座標を渡しているので
その値を新たな zero1.pngの画像に点として表示したいです

説明文に書いてある通り、以下のXY座標を使えば、表示させたい点の中心部分を得られますね。

座標XY
左上x0y0
右下x1y1

ですので、四角形の頂点に点をつけたいのであれば、

(x0,y0)(x1,y0)
(x0,y1)(x1,y1)

が、それぞれの頂点に対応する座標です。

あとは、cv2.circle()の説明に従って点を描画すればOKです。
※circleとありますが、直径を1(ピクセル)にすれば点として描画できます。

cv2.circle(img,(447,63), 63, (0,0,255), -1)は、
画像データimgのx:447,y:63に、直径63で、赤(0,0,255)の円を太さ-1(塗りつぶし)で描画する、という指示になります。

また、ラベル要素をfor文で位置を取得する際に、同時に描画処理をしてしまえば別途ラベルごとにfor文をもう一度書き加える必要はなくスッキリさせられます。

投稿2020/01/03 08:27

編集2020/01/05 09:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0126tami

2020/01/03 09:14

四角形の頂点とはどの四角形のことでしょうか?? 1つ目のラベリング処理でx座標、2つ目のラベリング処理でy座標だけを取ってきて描画したいので 値としては1つだけに定まるのですが circleのアドバイス参考にさせていただきます!
退会済みユーザー

退会済みユーザー

2020/01/03 10:42

> 四角形の頂点とはどの四角形のことでしょうか?? 「各オブジェクトの外接矩形を赤枠で表示」の赤枠の外接矩形です。 夜に対応できたら!!!マークの部分も見ますね。
退会済みユーザー

退会済みユーザー

2020/01/03 11:45 編集

> 夜に対応できたら!!!マークの部分も見ますね。 コード中のfor i in top2_idx2が終わった時のiの値が格納されたまま最後のエラーのところまで処理が進んでいます。 ですので、center[11][0]をやろうとしてエラーが起きているようです。 恐らくcenter[i]のiは0~5の値しか入らないはずです。 最後のエラーが起きている部分の変数をprint()で確認しながら進めるのがよさそうです。 "kuro1.png"、img_src01、img_src02、midoriがあればこちらでも再現できますので、もし回答が必要でしたら質問内容の部分にどの画像がどの変数に使うものかわかる状態で添付ください。
0126tami

2020/01/05 06:03

ありがとうございます 画像も載せてみたのでぜひアドバイスお願いします for i in top2_idx2の部分を jに変えてみることで解決したりするのでしょうか?
0126tami

2020/01/05 06:04

そしてラベリング処理での結果については imshowで表示されると思います その中で使いたいのは 1つ目のラベリング処理の画像のx座標と2つ目のラベリング処理の画像のy座標です
退会済みユーザー

退会済みユーザー

2020/01/05 06:49

(1つ目のラベリング処理の画像のx座標,2つ目のラベリング処理の画像のy座標)に円を描きたい、ということですか?
0126tami

2020/01/05 07:49

円を書きたいというか 座標がここだと示したいということです 今回はそれがわかりやすいように円でも良いかなという意味です!
0126tami

2020/01/05 07:55

そして 2つのラベリング処理においてx座標とy座標で1つの円が表示されるようにしたいのです ここでは人間一人に対して2回ラベリング処理します まず重心のx座標そして足元のy座標という感じです それを元の人間のいない画像にx座標とy座標がわかるのでそこの円としてプロットしたいという感じなのです。。。
0126tami

2020/01/05 07:58

プログラムの全体の目的としては 人の位置を画像処理で求めて点の位置で見える化しようみたいな感じの目的なのです わかりにくくてごめんなさい ご協力とても感謝しています ぜひお力をお貸しくださいませ
0126tami

2020/01/05 12:22

なんどもありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問