今回はPythonの型に関するエラーについて書きたいと思います。ロボットの画像処理プログラムで座標を計算する処理を実装したところ、型の不一致によるエラーが発生したので解決方法を調べてみました。
エラーが発生したソースコード
以下のコードを実行した際にエラーが発生しました。OpenCVのcv2というライブラリに実装されている「line」という直線を描画する処理です。第二引数に描画するための座標を指定します。
box_right_center = box_right / 2
box_bottom_center = box_bottom / 2
cv2.line(img_cp, (box_right_center, box_bottom_center), (img_right_center, img_bottom_center), (0, 0, 255), 10)
発生したエラー
実際に発生したエラーがこちらです。
Traceback (most recent call last):
File "/home/pi/TensorflowLite-bin/mobilenetv2ssd-sync-usbcam_2.py", line 217, in <module>
imdraw = overlay_on_image(frames, res, camera_width, camera_height)
File "/home/pi/TensorflowLite-bin/mobilenetv2ssd-sync-usbcam_2.py", line 129, in overlay_on_image
cv2.line(img_cp, (box_right_center, box_bottom_center), (img_right_center, img_bottom_center), (0, 0, 255), 10)
TypeError: integer argument expected, got float
「TypeError: integer argument expected, got float」というエラーが表示されています。
cv2のlineメソッドで座標を指定したのですが、座標の引数はintだがfloat型の引数が渡されたというエラーのようです。
演算時の変数の型を確認する
Pythonでは型を確認するための「type」メソッドがあります。
実際にlineメソッドに渡す引数を計算した時のように、除算の計算を実行して型を確認してみます。
確認のため以下のプログラムを作成しました。
#整数を代入
val1 = 4
val2 = 2
#除算
result = val1 / val2
#型を表示
print("val1 = ", type(val1))
print("val2 = ", type(val2))
print("result = ", type(result))
このプログラムを実行すると以下のような結果が出力されました。
val1 = <class 'int'>
val2 = <class 'int'>
result = <class 'float'>
整数同士で除算して、割り切れる場合でも変数の型はfloat型になっているようです。このようなPythonの仕様により、意図しないところでfloat型の変数が引数に渡ってしまっていたことがわかりました。
float型をinteger型に変換する
floatは32bit浮動小数点なので、これを整数型のinteger型に変換してlineメソッドに渡してやる必要があります。intメソッドは少数は切り下げ、丸めたいときはroundメソッドが使用できます。
val3 = 1.5
print("int → ", int(val3)) #少数は切り下げ
print("round → ", round(val3)) #少数は四捨五入
実行した結果は以下の通りです。
int → 1
round → 2
ソースコードを修正する
最後に以下のようにソースコードを修正したら、無事エラーを解消できました。
box_right_center = int(box_right / 2)
box_bottom_center = int(box_bottom / 2)
まとめ
今回は除算による型の変化が原因で発生するエラーについてまとめてみました。C言語などは厳密に型定義を行いますが、今回のエラーは動的に型が決定されるPythonならではかなという感じがしました。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント