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:面倒くさそうというのが最も大きな理由でしたが...