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
pillow
の Image
を使って、
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()
という風に書いていると怒られるということでした。
よしなに変換していきましょう!