自己紹介
株式会社digitalbigmoのパイプラインエンジニアの小池@plinecomです。
これは何?
Pythonで、OpenCVのコードとOpenImageIO(OIIO)のコードを混ぜて処理する方法を記す。どちらも画像データをNumPy配列として取り出せるので、お互いにやり取りすることができるのだ。
とりあえず、コード
main.py
import OpenImageIO as oiio
import glob
import cv2
if __name__ == '__main__':
for path in glob.glob('/foo/bar/*.exr'):
print(path)
jpg_path = path.replace('.exr', '_txt.jpg')
#Read File
buf = oiio.ImageBuf(path)
#to Numpy Array
nd = buf.get_pixels(oiio.FLOAT)
#Shuffle
nd = cv2.cvtColor(nd, cv2.COLOR_RGB2BGR)
#Draw Text
colorBGR = (0.0, 0.0, 1.0)
cv2.putText(img=nd,
text="OpenCV",
org=(50, 100),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=2,
color=colorBGR,
thickness=15)
#De-Shuffle
nd = cv2.cvtColor(nd, cv2.COLOR_BGR2RGB)
#Back to oiio
buf.set_pixels(oiio.ROI(), nd)
#Write File
buf.write(jpg_path)
必要なPython外部モジュール
- OpenImageIO
- cv2
- NumPy
Dockerfileも用意した。
Dockerfile
FROM rockylinux:8
RUN dnf install -y which python3 epel-release
RUN dnf config-manager --set-enabled powertools
RUN dnf install -y python3-openimageio python3-numpy
RUN pip3 install -U pip
RUN pip3 install opencv-python
terminal
docker pull plinecom/py_oiio_opencv
コードの説明
高レベルAPIにおけるNumPy配列の取り出し
#to Numpy Array
nd = buf.get_pixels(oiio.FLOAT)
せっかくOpenEXRを使っているので、浮動小数点型で出してもらっている。
RGBからBGRへの変換
#Shuffle
nd = cv2.cvtColor(nd, cv2.COLOR_RGB2BGR)
OpenImageIOやその他最近のライブラリでは画像データの並びはRGBなことが多いが、OpenCVの画像データの並びはBGRの順番なので、ここでシャッフルする。
OpenCVによる文字の書き込み
#Draw Text
colorBGR = (0.0, 0.0, 1.0)
cv2.putText(img=nd,
text="OpenCV",
org=(50, 100),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=2,
color=colorBGR,
thickness=15)
赤い文字を描きたいので、BGRの順にRだけ値を入れている。浮動小数点なので1.0
BGRからRGBへ戻す
#De-Shuffle
nd = cv2.cvtColor(nd, cv2.COLOR_BGR2RGB)
高レベルAPIにおけるNumPy配列の戻し
#Back to oiio
buf.set_pixels(oiio.ROI(), nd)
全部戻すので、ROIはデフォルト値を与えて全領域としている。
宣伝
株式会社digitalbigmoでは美肌プラグインの販売や映像VFXの制作業務を行なっています。ご興味のある方は、webページを見にきてください。一緒にお仕事しましょう。