0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでOpenCVとOpenImageIO(OIIO)を相互運用する

Last updated at Posted at 2025-04-09

自己紹介

株式会社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ページを見にきてください。一緒にお仕事しましょう。

参考文献

OpenImageIO本家(英語)
OpenImageIO本家リファレンス(英語)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?