LoginSignup
6
4

More than 5 years have passed since last update.

cv2.imread()で'NoneType'エラーが出てしまった時の対策。

Posted at

こちらの画像処理100本ノックを行う際にエラーが出て困った。
というよりかはimread()の使い方の問題であったが。

コードとエラーは以下の通り。

コード
import cv2
img = cv2.imread("imori.jpg")
red = img[:, :, 2].copy()
エラー内容
TypeError: 'NoneType' object is not subscriptable
ディレクトリ構造
Gasyori100knock ← ワークスペース
│
├─Question_01_10
│  │
│  ├─imori.jpg ← 読み込みたい画像
│  ├─question1.py ← 実行ファイル

NoneTypeと出ている。img箇所がうまく読み込めていないらしい。

結論

パス指定が間違っていたため、画像がうまく読み込めなかった。

理由

gitからプロジェクトをクローンしてきて、クローンしたフォルダをそのままワークスペースに設定した。
どうやら実行時のディレクトリが基準のパスになるみたい。今回はPythonファイルを実行するのにワークスペースから実行していた。つまり、画像の読み込みはワークスペースから見た相対パスを指定するか、絶対パスで指定しなければならない。

ディレクトリ構造
Gasyori100knock ← ワークスペースであるここが基準
│
├─Question_01_10
│  │
│  ├─imori.jpg ← ワークスペースから見て./Question_01_10/imori.jpgと指定しなければいけない。
│  ├─question1.py ← 実行ファイルを基準に考えるわけではないみたい。

対策

常にワークスペースから実行するのであれば相対パスである./Question_01_10/imori.jpgで良いけど、それはプログラム的にどうなのか?と思ったので少し書き換える。

コード(修正後)
import cv2
import os

img_path_name = "imori.jpg" # 対象画像の名前
bace = os.path.dirname(os.path.abspath(__file__)) # 実行ファイルのディレクトリ名
target_path = os.path.join(bace, img_path_name) # パスの連結
img = cv2.imread(target_path)
red = img[:, :, 2].copy()

os.path.abspath(__file__)で実行ファイル(.pyまで)の絶対パスを取得。os.path.dirname()でディレクトリ名に変換。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4