前提・実現したいこと
赤色の球の画像をマスクした後にラベリング処理し、処理したものの中心座標を求め、X = [[x座標1、y座標1],[x座標2、y座標2],[x座標3、y座標3],,,]みたいなリストを作り、x座標とy座標のグラフをmatplotlibで出力させようと考えているのですが、エラーが出てしまいます。
発生している問題・エラーメッセージ
エラーの内容はXが定義されていないというものですが、どのようにすればXを定義できるのでしょうか。それともそもそも繰り返し処理の組み方が間違っているのでしょうか?
X = np.array(X) NameError: name 'X' is not defined
該当のソースコード
import cv2 import numpy as np import matplotlib.pyplot as plt def red_detect(img): # HSV色空間に変換 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 赤色のHSVの値域1 hsv_min = np.array([0,127,0]) hsv_max = np.array([30,255,255]) mask1 = cv2.inRange(hsv, hsv_min, hsv_max) # 赤色のHSVの値域2 hsv_min = np.array([150,127,0]) hsv_max = np.array([179,255,255]) mask2 = cv2.inRange(hsv, hsv_min, hsv_max) return mask1 + mask2 img_path = "akamaru.jpg" img = cv2.imread(img_path) # 赤色検出 mask = red_detect(img) kernel = np.ones((5,5),np.uint8) mask = cv2.erode(mask,kernel,iterations = 3) # ラベリング処理 label = cv2.connectedComponentsWithStats(mask) # オブジェクト情報を項目別に抽出 n = label[0] - 1 data = np.delete(label[2], 0, 0) center = np.delete(label[3], 0, 0) def oo(): X = [] # オブジェクト情報を取得 for i in range(n): #各オブジェクトの重心座標を表示 print("ID: " +str(i + 1)," ","X: " + str(int(center[i][0]))," ","Y: " + str(int(center[i][1]))) X += [int(center[i][0]),int(center[i][1])] i += 1 if i == n: break return X if __name__ == "__main__": oo() X = np.array(X) plt.figure() plt.title('data') plt.scatter(X[:,0], X[:,1], marker='o', s=75, color='black') plt.show()
補足情報(FW/ツールのバージョンなど
動作環境
Python3.8
Windows10
OPENCV4.4.0
あまり理解が深まっていないため、所々とんちんかんなことをしているかもしれませんが、ご教授いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/20 02:48