Tkinter+OpenCV: PILにちゃんと仲人させると

3週間ほど前に、TkinterとOpenCVをPILで繋ぐのは、色変換もしなくちゃいけなくてスマートでないのでパスしましたが[*1]、気を取り直してコードを書いてみました。BGR⇒RGB色変換をOpenCVで済ませば結構コンパクトなコードになりますね。

from PIL import Image, ImageTk

def PhotoImage(img):
  """ OpenCVのIplImageをTkinterのPhotoImageに変換する """
    if img.nChannels == 1:
        pil = Image.fromstring("L", GetSize(img), img.tostring())
    elif img.nChannels == 3:
        rgb = CreateImage(GetSize(img), img.depth, img.nChannels)
        CvtColor(img, rgb, CV_BGR2RGB)
        pil = Image.fromstring("RGB", GetSize(rgb), rgb.tostring())
    else:
        raise TypeError("Unrecognised nChannels %d" %(img.nChannels))
    return ImageTk.PhotoImage(pil)

aha! BGR⇒RGB変換はPILでやっても良いですね。その場合は、下の様になるかな。

        pil = Image.fromstring("RGB", GetSize(img), img.tostring(), "raw", "BGR")

*1:面倒くさそうというのが最も大きな理由でしたが...