LoginSignup
16
13

More than 5 years have passed since last update.

OpenCV-Pythonのimreadはpathlibを受け付けない

Posted at

Python3.4 から、 Pathlib が標準ライブラリとして搭載されました。
もう Python3.7が出たというのに、恥ずかしながら今まで Pathlib を使っていなかったので試してみました。

私は普段、 OpenCV-Python を使用して画像の読み出し、書き込みを行っていますが、
そのときに困ったのが、OpenCV-Python では、Pathlib を画像のパスとして入力できないことでした。

 起こった問題

from pathlib import Path
import matplotlib.pyplot as plt
import cv2

path = Path('images')
pngs = path.glob('*.png')
for p in pngs:
  png = cv2.cvtColor(cv2.imread(p), cv2.COLOR_BGR2RGB)
  plt.figure(figsize=(10, 10))
  plt.imshow(png)
  plt.show()

とすると、 TypeError: bad argument type for built-in operation というエラーが出てしまいます。

解法1

pillowImage を使って、

from pathlib import Path
import matplotlib.pyplot as plt
from PIL import Image

path = Path('images')
pngs = path.glob('*.png')
for p in pngs:
  png = Image.open(p)
  plt.figure(figsize=(10, 10))
  plt.imshow(png)
  plt.show()

とすると、うまく画像を読み出すことができました。

解法2

cv2.imread()の引数の画像パスを、 str() で囲ってあげることによって読み出すことができました。
path.glob を for で回しても、その中身は、 <class 'pathlib.PosixPath'> になっていて、
OpenCV-Python が pathlibのオブジェクトを受け付けていないから起こっていた問題でした。

ちなみに、pathlib の取り扱いについては、こちらの記事 がとても参考になりました!

from pathlib import Path
import matplotlib.pyplot as plt
import cv2

path = Path('images')
pngs = path.glob('*.png')
for p in pngs:
  png = cv2.cvtColor(cv2.imread(str(p)), cv2.COLOR_BGR2RGB)
  plt.figure(figsize=(10, 10))
  plt.imshow(png)
  plt.show()

まとめ

今まで(Python3.4より前)の記法で、

import glob
pngs = glob.glob('/data/*.png')
for p in pngs:
  png = cv2.cvtColor(cv2.imread(p), cv2.COLOR_BGR2RGB)
  plt.figure(figsize=(10, 10))
  plt.imshow(png)
  plt.show()

という風に書いていると怒られるということでした。
よしなに変換していきましょう!

16
13
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
16
13