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

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

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

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

Python

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

Q&A

1回答

1225閲覧

物体を検出するプログラムを作っているのですが、イテラブルのエラーが出てしまいます。

sadfa

総合スコア1

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/06/24 09:29

OpenCVで動画の識別反応をするプログラムを作っています。
赤、青、黒の物体を検知したら丸で囲むようにしたいのですが、下のようなエラーが出てしまいます。
試しにdef getBlueMaskの中のlower_blue=np.array([90,60,0])をlower_blue=np.array([0,60,0])にしてみたら、青の判定はできませんが実行することはできました。
どこを直したらよいでしょうか。
#コード

import

1import numpy as np 2#動画のパスと名前を指定 3MOVIE_PATH='/Users/name/Desktop'+'/' 4MOVIE_NAME='test2.mov' 5#動画の解像度の倍率(縮小:MAG<1.0、変化なし:MAG=1.0、拡大MAG>1.0 6MAG=0.3 7#動画の出力の名前を指定(パスは元画像と同じ) 8OUT_NAME='out3.mp4' 9 10#検出したい色の選択、赤い物体だけ検出したいなら"Red"のみ 11COLOR=["Black","Red","Blue"]#Green,White 12 13#赤色検出のマスクを定義 14def getRedMask(img): 15 #画像をRGBからHSV色空間に変換 16 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 17 18 #HSV色空間における赤色の範囲を指定[色相、彩度、明度] 19 hsv_min=np.array([0,150,150]) 20 hsv_max=np.array([10,255,255]) 21 #指定した範囲の検出器を作成 22 mask1=cv2.inRange(hsv,hsv_min,hsv_max) 23 24 #赤色は0度と180度の境目に位置するため、160~179度の範囲も指定 25 hsv_min=np.array([160,150,150]) 26 hsv_max=np.array([179,255,255]) 27 28 #指定した範囲の検出器を作成 29 mask2=cv2.inRange(hsv,hsv_min,hsv_max) 30 31 #2種類の検出器を統合 32 mask=mask1+mask2 33 34 #画像に検出器を適用 35 masked_img=cv2.bitwise_and(img,img,mask=mask) 36 37 return masked_img 38 39def getBlueMask(img): 40 #画像をRGBからHSV色空間に変換 41 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 42 43 #HSV色空間における青色の範囲を指定[色相、彩度、明度] 44 lower_blue=np.array([90,60,0]) 45 upper_blue=np.array([150,255,255]) 46 #指定した範囲の検出器を作成 47 mask=cv2.inRange(hsv,lower_blue,upper_blue) 48 49 #画像に検出器を適用 50 masked_img=cv2.bitwise_and(img,img,mask=mask) 51 52 return masked_img 53 54def getGreenMask(img): 55 #画像をRGBからHSV色空間に変換 56 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 57 58 #HSV色空間における緑色の範囲を指定[色相、彩度、明度] 59 lower_green=np.array([75,50,50]) 60 upper_green=np.array([110,255,255]) 61 #指定した範囲の検出器を作成 62 mask=cv2.inRange(hsv,lower_green,upper_green) 63 64 #画像に検出器を適用 65 masked_img=cv2.bitwise_and(img,img,mask=mask) 66 67 return masked_img 68 69def getBlackMask(img): 70 #画像をRGBからHSV色空間に変換 71 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 72 73 #HSV色空間における黒色の範囲を指定[色相、彩度、明度] 74 lower_black=np.array([0,30,0]) 75 upper_black=np.array([225,255,120]) 76 #指定した範囲の検出器を作成 77 mask=cv2.inRange(hsv,lower_black,upper_black) 78 79 #画像に検出器を適用 80 masked_img=cv2.bitwise_and(img,img,mask=mask) 81 82 return masked_img 83 84def getWhiteMask(img): 85 #画像をRGBからHSV色空間に変換 86 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 87 88 #HSV色空間における青色の範囲を指定[色相、彩度、明度] 89 lower_blue=np.array([0,0,20]) 90 upper_blue=np.array([180,45,255]) 91 #指定した範囲の検出器を作成 92 mask=cv2.inRange(hsv,lower_blue,upper_blue) 93 94 #画像に検出器を適用 95 masked_img=cv2.bitwise_and(img,img,mask=mask) 96 97 return masked_img 98 99def getCircle(masked_img,t,r,Orbit): 100 #色検出した画像をグレースケール化 101 gray=cv2.cvtColor(masked_img,cv2.COLOR_RGB2GRAY) 102 #閾値(t)より画素値が大きいならば白、そうでなければ黒とする二値化 103 #検出したオブジェクトをより目立たせるための処理 104 ret,thresh=cv2.threshold(gray,t,255,cv2.THRESH_BINARY) 105 #輪郭(contours)を抽出、引数は(画像、輪郭検出モード、輪郭に近似方法) 106 #戻り値は輪郭座標、輪郭の階層情報(今回は使わない) 107 contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 108 109 #輪郭の面積を小さい順にソート 110 contours.sort(key=cv2.contourArea,reverse=True) 111 #輪郭の面積が小さい順に処理 112 for cnt in contours: 113 #輪郭の最小外接円を取得、戻り値は円の中心座標と半径 114 (x,y),radius=cv2.minEnclosingCircle(cnt) 115 center=(int(x),int(y)) 116 radius=int(radius) 117 #半径が指定のr以上の円を検出したいならば(ノイズによる極小の円は検出から除外) 118 if radius>r: 119 return center,radius,thresh 120 else: 121 return (0,0),0,thresh 122 return(0,0),0,thresh 123def Play(): 124 #動画の読み込む 125 cap=cv2.VideoCapture(MOVIE_PATH+MOVIE_NAME) 126 #動画が読み込めたか確認 127 if not cap.isOpened(): 128 cap.release() 129 print("動画が認識できません。パスを確認して正しい動画ファイルを指定してください。") 130 return 131 #動画の解像度を取得 132 Width=int(MAG*cap.get(3)) 133 Height=int(MAG*cap.get(4)) 134 #動画のフォーマットを指定 135 fmt=cv2.VideoWriter_fourcc(*'XVID') 136 #動画出力パス、フォーマット、FPS、解像度の指定、カラー出力 137 out=cv2.VideoWriter(MOVIE_PATH+OUT_NAME,fmt,20.0,(Width,Height),True) 138 #1フレームずつ画像を読み込む 139 while True: 140 #次のフレームを読み込み、retは読み込み判定、imgは読み込んだフレーム画像 141 ret,img=cap.read() 142 #読み込みに失敗したならば 143 if not ret: 144 break 145 #画像のリサイズ 146 img=cv2.resize(img,(Width,Height)) 147 #最小外接円を表示した画像の定義 148 circled_img=img 149 #指定した色(COLOR)に対し、検出器の実行と最小外接円の追加 150 for col in COLOR: 151 if col=="Black": 152 masked_img=getBlackMask(img) 153 center,radius,_=getCircle(masked_img,20,20,True) 154 #black\center=center 155 #最小外接円が取得できたならば 156 if radius!=0: 157 circled_img=cv2.circle(circled_img,center,radius,(0,0,0),thickness=10) 158 elif col=="Blue": 159 masked_img=getBlueMask(img) 160 center,radius,_=getCircle(masked_img,20,20,True) 161 #blue_center=center 162 #最小外接円が取得できたならば 163 if radius!=0: 164 circled_img=cv2.circle(circled_img,center,radius,(255,0,0),thickness=10) 165 elif col=='Red': 166 masked_img=getRedMask(img) 167 center,radius,_=getCircle(masked_img,20,20,True) 168 #blue_center=center 169 #最小外接円が取得できたならば 170 if radius!=0: 171 circled_img=cv2.circle(circled_img,center,radius,(0,0,255),thickness=10) 172 elif col=='White': 173 masked_img=getWhiteeMask(img) 174 center,radius,_=getCircle(masked_img,20,20,True) 175 #blue_center=center 176 #最小外接円が取得できたならば 177 if radius!=0: 178 circled_img=cv2.circle(circled_img,center,radius,(255,255,255),thickness=10) 179 elif col=='Green': 180 masked_img=getGreenMask(img) 181 center,radius,_=getCircle(masked_img,20,20,True) 182 #blue_center=center 183 #最小外接円が取得できたならば 184 if radius!=0: 185 circled_img=cv2.circle(circled_img,center,radius,(0,255,0),thickness=10) 186 else: 187 print("色の指定が間違っています。") 188 return 189 #最小外接円を表示した画像を表示 190 cv2.imshow('frame',circled_img) 191 #最小外接円を表示した画像をoutに追加 192 out.write(circled_img) 193 194 #1ミリ秒間sleep 195 key=cv2.waitKey(1) 196 #スリープ中にqキーが押された場合 197 if key==ord('q'): 198 break 199 200 print("動画の再生を終了しました") 201 #frameウィンドウを閉じる 202 cv2.destroyWindow('frame') 203 #動画の読み込み解除 204 cap.release() 205 out.release() 206 207if __name__ == '__main__': 208 Play() 209

#エラー

TypeError

1<ipython-input-1-1d675000bddd> in <module> 2 207 3 208 if __name__ == '__main__': 4--> 209 Play() 5 210 6 211 7 8<ipython-input-1-1d675000bddd> in Play() 9 159 elif col=="Blue": 10 160 masked_img=getBlueMask(img) 11--> 161 center,radius,_=getCircle(masked_img,20,20,True) 12 162 #blue_center=center 13 163 #最小外接円が取得できたならば 14 15TypeError: 'NoneType' object is not iterable

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

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

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

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

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

meg_

2020/06/24 11:19

質問のコードはご自身で作成されたものですか?
guest

回答1

0

プログラムの中身は全く理解できませんが、 getCircle(masked_img,t,r,Orbit) 関数の最後の行のインデントが間違っているのではないでしょうか?

python

1def getCircle(masked_img,t,r,Orbit): 2 <省略> 3 for cnt in contours: 4 <省略> 5 if radius>r: 6 return center,radius,thresh 7 else: 8 return (0,0),0,thresh 9 return(0,0),0,thresh

となっていますが、これだと、 contours が0個だと None が返り、TypeError: 'NoneType' object is not iterable のエラーになってしまうのではないでしょうか。それに if-else の中が両方とも return なので最後の行が実行されることはありません。

python

1def getCircle(masked_img,t,r,Orbit): 2 <省略> 3 for cnt in contours: 4 <省略> 5 if radius>r: 6 return center,radius,thresh 7 else: 8 return (0,0),0,thresh 9 return(0,0),0,thresh

が正しいのではないですか?
これでも contours が複数あっても最初の1個しか見ないのはおかしいので、本当は

python

1def getCircle(masked_img,t,r,Orbit): 2 <省略> 3 for cnt in contours: 4 <省略> 5 if radius>r: 6 return center,radius,thresh 7 return(0,0),0,thresh

となってるべきではないかとも思います。

投稿2020/06/26 10:08

編集2020/06/26 10:14
mit0223

総合スコア3401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問