前提・実現したいこと
最終的にはリアルタイム(動画)である色の物体の座標を認識し(python,opencvを使用)
Arduinoに送信したいと考えています
内容が類似しているコードを見つけたので学習の一環として
読み解きながら実行したいと考えています。
発生している問題・エラーメッセージ
昨日よりPythonの学習をはじめた為、あまりうまく説明できませんが 状況としてはステップオーバー(1行ずつ実行した際に defの中身とtestの中身を飛ばして実行しているように見えます、結果は出力されません) 理解できていない点として 1.frame(14行目)には何か指定しなければならないのでしょうか 2.img = cv2.imread("sample.jpg") (51行目)をCドライブ内で 絶対参照で指定していますがこれは問題でしょうか。(imwriteも同様) 3.他に当方が指定する項目はありますでしょうか 4.別途、内容を満たすソースコードがあれば恐縮ながら教えてほしいです
該当のソースコード
python
1 2 3import cv2 4 5import numpy as np 6 7 8 9# 0 <= h <= 179 (色相) OpenCVではmax=179なのでR:0(180),G:60,B:120となる 10 11# 0 <= s <= 255 (彩度) 黒や白の値が抽出されるときはこの閾値を大きくする 12 13# 0 <= v <= 255 (明度) これが大きいと明るく,小さいと暗い 14 15# ここでは青色を抽出するので120±20を閾値とした 16 17LOW_COLOR = np.array([100, 75, 75]) 18 19HIGH_COLOR = np.array([140, 255, 255]) 20 21 22 23# 抽出する青色の塊のしきい値 24 25AREA_RATIO_THRESHOLD = 0.005 26 27 28 29def find_specific_color(frame,AREA_RATIO_THRESHOLD,LOW_COLOR,HIGH_COLOR): 30 31 """ 32 33 指定した範囲の色の物体の座標を取得する関数 34 35 frame: 画像 36 37 AREA_RATIO_THRESHOLD: area_ratio未満の塊は無視する 38 39 LOW_COLOR: 抽出する色の下限(h,s,v) 40 41 HIGH_COLOR: 抽出する色の上限(h,s,v) 42 43 """ 44 45 # 高さ,幅,チャンネル数 46 47 h,w,c = frame.shape 48 49 50 51 # hsv色空間に変換 52 53 hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) 54 55 56 57 # 色を抽出する 58 59 ex_img = cv2.inRange(hsv,LOW_COLOR,HIGH_COLOR) 60 61 62 63 # 輪郭抽出 64 65 _,contours,hierarchy = cv2.findContours(ex_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 66 67 68 69 # 面積を計算 70 71 areas = np.array(list(map(cv2.contourArea,contours))) 72 73 74 75 if len(areas) == 0 or np.max(areas) / (h*w) < AREA_RATIO_THRESHOLD: 76 77 # 見つからなかったらNoneを返す 78 79 print("the area is too small") 80 81 return None 82 83 else: 84 85 # 面積が最大の塊の重心を計算し返す 86 87 max_idx = np.argmax(areas) 88 89 max_area = areas[max_idx] 90 91 result = cv2.moments(contours[max_idx]) 92 93 x = int(result["m10"]/result["m00"]) 94 95 y = int(result["m01"]/result["m00"]) 96 97 return (x,y) 98 99 100 101def test(): 102 103 img = cv2.imread("sample.jpg") 104 105 106 107 # 位置を抽出 108 109 pos = find_specific_color( 110 111 img, 112 113 AREA_RATIO_THRESHOLD, 114 115 LOW_COLOR, 116 117 HIGH_COLOR 118 119 ) 120 121 122 123 if pos is not None: 124 125 cv2.circle(img,pos,10,(0,0,255),-1) 126 127 128 129 cv2.imwrite("result.jpg",img) 130 131 132 133def main(): 134 135 # webカメラを扱うオブジェクトを取得 136 137 cap = cv2.VideoCapture(0) 138 139 140 141 142 143 while True: 144 145 ret,frame = cap.read() 146 147 148 149 if ret is False: 150 151 print("cannot read image") 152 153 continue 154 155 156 157 # 位置を抽出 158 159 pos = find_specific_color( 160 161 frame, 162 163 AREA_RATIO_THRESHOLD, 164 165 LOW_COLOR, 166 167 HIGH_COLOR 168 169 ) 170 171 172 173 if pos is not None: 174 175 # 抽出した座標に丸を描く 176 177 cv2.circle(frame,pos,10,(0,0,255),-1) 178 179 180 181 # 画面に表示する 182 183 cv2.imshow('frame',frame) 184 185 186 187 # キーボード入力待ち 188 189 key = cv2.waitKey(1) & 0xFF 190 191 192 193 # qが押された場合は終了する 194 195 if key == ord('q'): 196 197 break 198 199 200 201 cv2.destroyAllWindows() 202 203
補足情報(FW/ツールのバージョンなど)
Python 3.8.2
Opnecv-python 4.2.0.34
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/02 04:34