gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

'tuple' object has no attribute 'pop'

2024-10-23 18:40:55 | Python
openCVを使った機械学習や画像処理をしていると 'tuple' object has no attribute 'pop' というエラーが度々生じる。
タプルは辞書型で、変数ではないことから編集や修正はできませんよというエラーです。
openCVを使って輪郭線(コンター)の処理を使用しようとすると cv2.findContours の出力値がこのタプルで返される。それを編集しようとしてエラーが生じるわけです。
でも、 max_area = contours.pop(k) のような処理をしたい場合があります。このような場合には、タプルからリストへと変換して処理を続行するということで回避できます。

例えば、

conts = list(contours)
と一時的にリスト変換して、このリストに対して、
max_area = conts.pop(max_area_idx)

とすれば良いわけです。

'numpy.ndarray' object is not callable

2024-10-16 20:44:48 | Python
python でプログラムを作っていて、よく使うルーチンを関数化したところ、'numpy.ndarray' object is not callableが発生してしまう。この作った関数は一回目は正常に動く。でも2回目以降を実行するとこのエラーが発生してしまう。
なぜかこのエラーは画像を扱うプログラムを作っていると良く発生するようです。

原因は単に作った関数名と同じ変数を使ってしまったから。
例えば、
def rgbgray(img)
・・・
return img
のような関数を定義した後に、この関数を以下のように使ってしまうとエラーになってしまう。

rgbgray = rgbgray(img)

画像処理を何度か繰り返していると、うっかりこのようなミスをしてしまいます。
簡単に修正するには関数名を、rgbGrayのように一部を大文字にして小文字の変数と区別することです。
一部大文字にしている関数名が多いのはなぜかと昔思っていたのですが素人はハマってしまいますよね。