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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

1134閲覧

if not list:で発生するエラーについて

shymax

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/12/16 11:16

前提・実現したいこと

画像の円を検出した場合にその場所をクリックするために下記のコードを書いたところ、円を検出した(リストに円の座標が入っている)時にエラーが出てしまいます。
どうすれば解決できるでしょうか?ご教授よろしくお願いします。

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_17244/989428965.py in <module> 9 boms = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=0.6, minDist=50, param1=100, param2=100, minRadius=35, maxRadius=40) 10 #円があれば円をクリック ---> 11 if not boms: 12 pass 13 else: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

該当のソースコード

Physon

1import cv2 2import pyautogui as pg 3 4#画像読み込み 5img = cv2.imread("img/playscreen.png") 6 7#グレイスケールに変換 8gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 9 10#円の座標抽出 11boms = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=0.6, minDist=50, param1=100, param2=100, minRadius=35, maxRadius=40) 12 13#円があれば円をクリック 14if not boms: 15 pass 16else: 17 for b in boms[0, :]: 18 pg.moveTo(b[0], b[1]) 19 pg.click()

#試したこと

自分で作ったリストで試したところ動いたので、cv2.HoughCirclesに原因があるのだと思います。

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

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

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

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

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

meg_

2021/12/16 11:39

bomsはリストですか?
shymax

2021/12/16 11:48

円を二つ検出すると中身はこんな感じになります。 [[[200.5 438.5 38.3] [429.5 370.5 38.3]]]
guest

回答4

0

円が検出されない場合、cv2.HoughCircles()None を返す様です。なので、以下の様にしてもよさそうです。

if boms is None: pass else: :

投稿2021/12/16 12:07

melian

総合スコア19618

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

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

0

ベストアンサー

まず以下のページを読んで、リストとnumpy.ndarrayは全く別の者であることを理解してください。

公式ドキュメント リスト型 (list)
公式ドキュメント numpy.ndarray
Pythonのリストと配列とnumpy.ndarrayの違いと使い分け

次に、cv2.HoughCirclesの値はリストではなくnumpy.ndarrayであることを理解してください。

【OpenCV】cv2.HoughCircles()の使い方【円を検出する】

以上が理解できてから、もう一度よく考えてみてください。
どうしても分からないなら、彩度teratailで質問してみると良いと思います。

投稿2021/12/16 11:51

ppaul

総合スコア24666

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

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

shymax

2021/12/16 13:01

回答ありがとうございます。貼ってくださったリンクを見て自分なりに考えてみました。条件が不明確でTrue,Falseで判断できなかったという結論になりました。 if np.any(boms): for b in boms[0, :]: pg.moveTo(b[0], b[1]) pg.click() else: pass 稚拙ですが最終的に上のような形で解決しました。本当にありがとうございます。
guest

0

ndarray全般に関することなのですが、not bomsなどの判定結果は各要素に対して行われます。
その結果も複数になるので単純な(一意な)if文では判定できず提示エラーが発生します。

今回のケースでは結果が3次元の配列で返るようなので、たとえば以下のような判定でよいかと思います。
ハフ変換による円検出でも0番目の要素は必ず存在するとしているようですし。

Python

1import numpy as np 2 3# 単純なif文では判定できない例 4a = np.array([1,2]) 5#print(not a) # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 6print(not a.all()) # False 7 8for boms in [[[]],[[[1,2,3],[4,5,6]]]]: 9 boms = np.array(boms) 10 boms = boms[0] 11 if boms.shape[0] > 0: 12 print(boms) # やりたい処理

投稿2021/12/16 11:49

can110

総合スコア38233

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

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

0

google翻訳
ValueError: 複数の要素を持つ配列の真理値はあいまいです。 a.any()またはa.all()を使用します

bomsのナカミはなんでしょうか

投稿2021/12/16 11:46

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問