2016-03-30 2 views
0

私は最大のn個の等高線を取り除き、他のものを削除しようとしています。 しかし、いくつかのフレームでこの例外が発生しており、他のフレームではこの例外が発生しません!リストから複数の要素を持つ配列の真理値はあいまいです。 a.any()またはa.all()を使用インデックスからリストから削除するとき

Traceback (most recent call last): 
File "/Users/TheMaestro/Desktop/Max Planck/FishTracking/FishTracker/general_tests.py", line 93, in <module> 
contours_chest = ImageProcessor.get_bigest_n_contours(contours_chest, 3) 
File "/Users/TheMaestro/Desktop/Max Planck/Fish Tracking/FishTracker/Controllers/ImageProcessor.py", line 319, in get_bigest_n_contours 
contours.remove(contours[i]) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

を輪郭を削除しようとしたとき 例外が発生し、これは私のコードです:

コール:

contours, hierarchy = cv2.findContours(img_dilated_chest, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
contours = get_biggest_n_contours(contours, 3) 

機能:

def get_biggest_n_contours(contours, n): 
    contours = sorted(contours, key=get_area, reverse=True) 

    contours_count = len(contours) 

    if contours_count > n: 
     for i in range(n,contours_count): 
      contours.remove(contours[i]) 
      i -= 1 

    return contours 

Data information 前のページを確認しました答えはありますが、どこでa.anyやa.allを使うべきか分かりませんし、なぜ私はそれらを私のケースで使うべきかわかりません! インデックスを使用して削除するので、あいまいさを引き起こす比較は表示されません。

はありがとう

+0

実際には、輪郭線の数がn以上でループが機能しているかどうかを知りたいだけです。さもなければ、すべての輪郭を取ります。 –

+0

私はそれぞれの輪郭内の値ではなく輪郭自体を気にしています。 –

+0

警告を生成する正確なトレースバックを示してください。ブール値のコンテキストで配列をどこで使用しているのかは分かりません。 – chepner

答えて

2

私はcontoursの形状について全くわからないが、私はsortedにお電話した後、あなたがnumpyの配列のPythonのリストを作成したと思われます。

この行では、contours.remove(contours[i])このnumpy配列のリストから要素を削除しようとします。 list.removeメソッドは、listのすべての要素を削除する要素と比較して線形検索を行います。だからremoveメソッドでnumpyの配列とnumpyの配列を比較し、あいまいな比較のブール値に分岐することになります。

remove(削除する要素のインデックスがわからない場合にのみ実際に使用する)の代わりに、popそのインデックスの要素を使用できます。

しかし、あなたの場合にはより良い選択肢があるようです。私が正しく観察した場合contoursnの最大のエントリがあります。これは、データがソートされたとき(あなたがしたとき)のPythonでの簡単な作業です。あなたがそれをソートした後ので、あなただけの配列をスライスすることができます

def get_biggest_n_contours(contours, n): 
    contours = sorted(contours, key=get_area, reverse=True) 

    return contours[:n] 

正確がある場合は、 1未満n要素がある場合は、単にそれらをすべて 2を返すためにすべての作業を行いますスライシングn要素がすべて返されます 3.最初にn要素を返します。

1

それを反復しながら、あなたは一般的に、リストから削除してはならないが、これは正しいことはできません。

for i in range(n,contours_count): 
    contours.remove(contours[i]) 
    i -= 1 

i -= 1がでiので、実際の効果はありませんその後の反復はrangeの次の列です。それはあなたが最初n輪郭をしたいことが表示されますので、ちょうど行います

contours = contours[:n] 
関連する問題