は、あなたが特定のPIL(またはそのPillowフォーク)メソッドやクラスを使用する必要があります
これは、以下のプログラムでは3行で行われます。
self.im = Image.open(self.saved_image)
self.photo = ImageTk.PhotoImage(self.im)
そして、我々が選んだself.canvas
ウィジェットでself.photo
を表示:cv2.addWeighted()
を使用し、あなたが望む効果を再現するために、
self.canvas.create_image(0,0, anchor=tk.N+tk.W, image = self.photo)
セカンドOpenCVメソッド。しかし、私はあなたがすでにそれをしていると感じています。フレームを準備し、GUIの初期化メソッドを呼び出します -
self.img = cv2.imread(self.image_to_read)
self.overlay = self.img.copy()
cv2.rectangle(self.overlay, (500,50), (400,100), (0, 255, 0), -1)
self.opacity = 0.4
cv2.addWeighted(self.overlay, self.opacity, self.img, 1 - self.opacity, 0, self.img)
cv2.imwrite(self.saved_image, self.img)
プログラム設計:だから私はあなたにそれをしないプログラムのコードの一部を示し__init__()
:
を私は2つの方法を使用します。 - initialize_user_interface()
:GUIを描画し、以前の操作を実行します。
しかし、scalabilityの理由では、画像のさまざまな操作を処理するための別個のメソッドを作成する方が良いです。
フルプログラム(OpenCVの+ Tkinterの)ここ
ソースコードである(私は、Python 3.4を使用):
'''
Created on Apr 05, 2016
@author: Bill Begueradj
'''
import tkinter as tk
from PIL import Image, ImageTk
import cv2
import numpy as np
import PIL
class Begueradj(tk.Frame):
'''
classdocs
'''
def __init__(self, parent):
'''
Prepare the frame and call the GUI initialization method.
'''
tk.Frame.__init__(self, parent)
self.parent=parent
self.initialize_user_interface()
def initialize_user_interface(self):
"""Draw a user interface allowing the user to type
"""
self.parent.title("Bill BEGUERADJ: Image overlay with OpenCV + Tkinter")
self.parent.grid_rowconfigure(0,weight=1)
self.parent.grid_columnconfigure(0,weight=1)
self.image_to_read = 'begueradj.jpg'
self.saved_image = 'bill_begueradj.jpg'
self.img = cv2.imread(self.image_to_read)
self.overlay = self.img.copy()
cv2.rectangle(self.overlay, (500,50), (400,100), (0, 255, 0), -1)
self.opacity = 0.4
cv2.addWeighted(self.overlay, self.opacity, self.img, 1 - self.opacity, 0, self.img)
cv2.imwrite(self.saved_image, self.img)
self.im = Image.open(self.saved_image)
self.photo = ImageTk.PhotoImage(self.im)
self.canvas = tk.Canvas(self.parent, width = 580, height = 360)
self.canvas.grid(row = 0, column = 0)
self.canvas.create_image(0,0, anchor=tk.N+tk.W, image = self.photo)
def main():
root=tk.Tk()
d=Begueradj(root)
root.mainloop()
if __name__=="__main__":
main()
デモ:
これは、実行中のプログラムのスクリーンショットである。
これは素晴らしい解決策であり、最初の解決策が何を得ていたのかを拡大しています。しかし、私はすでに 'tkinter.label'を使用しているGUIの周りにたくさんのことを構築しています。ソリューションの冒頭では可能ですが、ラベルを使用してどのように行うことができますか? – AaronJPung
'tkinter.Canvas()'の代わりに 'tkinter.Label()'を使いたい場合は、自分のコードに 'self.canvas'を置き換え、ラベルを作成して' self.photo'というイメージを追加します: 'self.label = Tk.Label(self.parent、image = self.photo)'。 @DingoGetterのようにコードの残りの部分をそのまま残す –
これに 'self.label.grid(row = 0、column = 0)'も追加します。コードの残りの部分はそのままで、私が説明したように、 'self.canvas'を削除し、新しい' Label() 'を作成します。 –