Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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()

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

fusic
個性をかき集めて、驚きの角度から世の中をアップデートしつづける。
https://fusic.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away