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

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

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

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

Python

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

Q&A

解決済

1回答

3549閲覧

Opencv-python 画像認識による座標出力

Li3

総合スコア10

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/05/01 04:27

前提・実現したいこと

最終的にはリアルタイム(動画)である色の物体の座標を認識し(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

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. frameは実引数が与えられるので指定する必要はありません。
  2. 絶対パスでOKです。
  3. 関数は定義されていますが、それを実行するコードが含まれていません。

Python

1# 動画を処理する(表示のみで保存しない) 2main() 3 4# サンプル画像で実行できるかテストする(保存のみで表示しない) 5test() 6 7cv2.destroyAllWindows()

投稿2020/05/01 08:54

編集2020/05/01 08:55
mktia

総合スコア110

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

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

Li3

2020/05/02 04:34

無事に実行できました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問