LoginSignup
7
8

More than 5 years have passed since last update.

【OpenCV】imreadでちゃんと読み込まれたか確認したいとき

Last updated at Posted at 2016-12-13

TensorFlowで画像をnpy形式に変換する際にOpenCVを使ってましたが、エラーで完全にはまったのでメモ。

愚かなことに、ファイル入出力関連の関数は失敗したときの例外処理をきちんとしないと完全に詰むことを忘れてました。imread関数もその一種です。

以下はtensorflow用のデータセットを作る関数です。
imread関数を読んだ後の処理は、None判定をかませて行っています。
こうしないとNoneでコケるので必ずこれを行う必要があります。
(よくよく考えたら当たり前なんだよなあ...)

import os, sys
import numpy as np
import tensorflow as tf
import cv2

# config
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('imgdir', '/home/hoge/fuga/piyo', 'Image dataset path')
flags.DEFINE_string('imgclasses', 4, 'The num of image dataset classes')
IMAGE_SIZE = 84 # the size of image
TRAIN_IMG_DIRS = os.listdir(FLAGS.imgdir)

def main():
  train_image, train_label = cvGetImageAndLabel()
  #学習とかのコードは面倒なので略

def cvGetImageAndLabel():
  images = []
  labels = []
  for i, d in enumerate(TRAIN_IMG_DIRS):
    files = os.listdir(FLAGS.imgdir + '/' + d)
    for f in files:
      img = cv2.imread(FLAGS.imgdir + '/' + d + '/' + f)
      # この部分でNone判定
      if not img is None:
        img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE), interpolation = cv2.INTER_AREA)
        img = img.flatten().astype(np.float32)/255.0
        images.append(img)
        tmp = np.zeros(FLAGS.imgclasses)
        tmp[i] = 1
        labels.append(tmp)

  return np.asarray(images, dtype=np.float32), np.asarray(labels, dtype=np.float32)

if __name__ == '__main__':
  main()

コードの汚さはご愛敬です(?)

参考リンク

7
8
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
7
8