概要
Python で OpenCV を利用している時、以下の類のエラーが出ることが多くあります。
TypeError: 'NoneType' object is not subscriptable
TypeError: Image data of dtype object cannot be converted to float
上記のエラーはOpenCVに限らず様々なケースで起きうるものですが、OpenCVを利用している際には以下が原因で発生するケースがあります。
これついて詳しく知るために、 cv2.imread の仕様について確認していきます。
画像パスが正しくない時の cv2.imread の仕様
まず、画像パスが正しい場合の cv2.imread の仕様を確認します。
original_image = cv2.imread("正しい画像パス")
print(type(original_image))
# <class 'numpy.ndarray'> が出力される
このように、OpenCV では cv2.imread() の結果を Numpy の ndarray として受け取ることができます。
次に、画像パスが正しくない場合の cv2.imread の仕様を確認します。
original_image = cv2.imread("正しくない画像パス")
print(type(original_image))
# <class 'NoneType'> が出力される
このように、画像パスが正しくない場合、cv2.imread() の結果は None として受け取ります。
このコードに続く処理は、original_image には Numpy の ndarray が入っている前提が書かれていると思われます。
従って、概要で触れたようなエラーが発生します。
ちなみに、TypeError: ‘NoneType’ object is not subscriptable は None をスライスしようとした際に出るエラーです。
TypeError: Image data of dtype object cannot be converted to float は matplotlib の imshow で None を表示しようとした結果です。
対処法
仕様で確認した様に、画像パスが正しいか正しくないかで受け取る型が変わってしまいます。
cv2.imread() した直後に assert などで型のチェックをすることで、原因の特定がしやすくなります。
original_image = cv2.imread("正しくない画像パス")
assert type(original_image) is not type(None)
# 画像パスが正しく無い場合、AssertionError の例外が起きるため、画像パスに問題があることにすぐに気付ける
コメント