2016-04-04 88 views
1

私はTkinterとgrid()レイアウトマネージャを使ってGUIを作成しています。私はタブ付きウィンドウに、ラベルを使用して、私のGUIで画像を表示しています:図についてTkinterを使ってラベル画像にボックスを重ねる

label2 = ttk.Label(tab2) 
image2 = PhotoImage(file="lizard.gif") 
label2['image'] = image2 
label2.grid(column=0, row=0, columnspan=3) 

、のは、私は、画像内の座標のセットを知っている場合、画像は300×900であるとしましょう、どのように私ができます既知の(A、B、C、Dは説明目的のためだけに示されている)座標系によって定義された影付きボックスを画像上に重ねるか?

Illustration of concept

答えて

2

キャンバスウィジェットを使用する必要があります。これにより、イメージを描画し、その上に長方形をオーバーレイすることができます。

1

私はあなたにステップバイステップの解決策を教えてあげましょう。

画像を表示するときにtkinter.Label()を使用すると、他のウィジェットを選択することもできます。しかし、状況のため、のではなくtkinter.Canvas()ウィジェットを選択できます(ただし、tkinter.Label()を使用することを選択した場合、同じ論法は有効です)

技術的な問題:

あなたの問題を解決するために、2つの主要なサブ問題が含まれています

  • 2つのイメージをあなたが望むようにオーバーレイする方法。

    JPG形式の画像を読み取ることができるようにするにtkinter.Canvas()

を使用して画像を表示する方法

  • は、あなたが特定の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() 
    

    デモ:

    これは、実行中のプログラムのスクリーンショットである。

    enter image description here

  • +0

    これは素晴らしい解決策であり、最初の解決策が何を得ていたのかを拡大しています。しかし、私はすでに 'tkinter.label'を使用しているGUIの周りにたくさんのことを構築しています。ソリューションの冒頭では可能ですが、ラベルを使用してどのように行うことができますか? – AaronJPung

    +0

    'tkinter.Canvas()'の代わりに 'tkinter.Label()'を使いたい場合は、自分のコードに 'self.canvas'を置き換え、ラベルを作成して' self.photo'というイメージを追加します: 'self.label = Tk.Label(self.parent、image = self.photo)'。 @DingoGetterのようにコードの残りの部分をそのまま残す –

    +0

    これに 'self.label.grid(row = 0、column = 0)'も追加します。コードの残りの部分はそのままで、私が説明したように、 'self.canvas'を削除し、新しい' Label() 'を作成します。 –

    0

    上記のswersは素晴らしく深みがあり、私の正確な状況(Python 2.7の具体的な使用など)には合わなかった。しかし、この解決策は、私が探していた正確に何を私に与えた:

    canvas = Canvas(tab2, width=875, height=400) 
    image2=PhotoImage(file='lizard.gif') 
    canvas.create_image(440,180,image=image2) 
    canvas.grid(column=0, row=0, columnspan=3) 
    

    矩形がキャンバスの上に追加されます。

    x1 = 3, y1 = 10, x2 = 30, y2 = 20 
    canvas.create_rectangle(x1, y1, x2, y2, fill="blue", stipple="gray12") 
    

    stippleは長方形に透明性を追加支援するために、this例から来ています。

    関連する問題