2016-04-04 30 views
1

kullanarak etiket görüntüsünün üzerine bir kutu yerleştirme Bir GUI oluşturmak için Tkinter ve grid() düzen yöneticisini kullanıyorum. Bir sekmeli pencere, bir etiket kullanarak GUI görüntüyü gösteriyorum: açıklama içinTkinter

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

, bu reklam görüntü içinde bir dizi koordinat biliyorsanız görüntü 300 x 900 olduğunu varsayalım, Nasıl yardımcı Görüntü üzerinde gölgeli bir kutunun üzerine, bilinen (A, B, C, D, sadece örnekleme amacıyla gösterilen) koordinatlar tarafından tanımlanan üst üste yerleştirilmiş mi?

Illustration of concept

cevap

2

Bir tuval widget'ı kullanmak gerekecektir. Bu, bir görüntü çizmenize ve üzerinde bir dikdörtgen yerleştirmenize izin verecektir.

1

Size adım adım çözüm vereyim.

Görüntünüzü sizin yaptığınız gibi görüntülemek için tkinter.Label()'u kullanabilirsiniz, diğer widget'ları da seçebilirsiniz. Ama durum için, en yerine tkinter.Canvas() widget'ı seçmesine izin (ama tkinter.Label() kullanmayı seçerseniz aynı mantık geçerlidir)

Teknik konular:

Senin sorunun çözmek için 2 ana alt problemlerini içerir:

  • İstediğiniz şekilde 2 görüntü bindirilir.

    : jpg formatının bir görüntü okumak edebilmek için tkinter.Canvas()

kullanarak bir resmi görüntülemek için nasıl

  • , belirli PIL (veya Pillow çatal) yöntemini ve bir sınıf kullanmak gerekir ,

    self.canvas.create_image(0,0, anchor=tk.N+tk.W, image = self.photo) 
    

    İkinci arzu etkiyi çoğaltmak, cv2.addWeighted() kullanın: Biz seçti self.canvas widget'te self.photo görüntülemek sonra

    self.im = Image.open(self.saved_image) 
    self.photo = ImageTk.PhotoImage(self.im) 
    

    Ve:

    Bu, aşağıdaki programda 3 çizgilerle yapılır OpenCV yöntemi. Ama bunu daha önce yapmış olduğunuzu hissediyorum. çerçeveyi hazırlayın ve GUI başlatma yöntemini çağırın: -

    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) 
    

    Program tasarımı: Yani sadece size öyle programın kodu bölümünü göstermek __init__() :

    Ben 2 yöntem kullanabilirsiniz. - initialize_user_interface(): GUI'yi çizin ve önceki işlemleri gerçekleştirin. Ancak, scalability nedenlerinden ötürü, görüntünün farklı işlemlerini yürütmek için ayrı bir yöntem oluşturmak daha iyidir.

    Tam programı (OpenCV + Tkinter) İşte

    kaynak kodu (Python 3.4 kullanılır):

    ''' 
    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() 
    

    Demo:

    Bu çalışan programın bir ekran görüntüsü:

    enter image description here

  • +0

    Bu, harika bir çözümdür ve ilk çözümün nasıl gittiğini genişletir. Ancak, zaten 'tkinter.label' kullanan GUI etrafında çok şey var. Etiketi kullanarak bunu nasıl yapabilirim, bahsettiğiniz gibi çözümünüzün başında mümkün mü? – AaronJPung

    +0

    "tkinter.Canvas()' yerine "tkinter.Label()" işlevini kullanmak istiyorsanız, kodumda sadece self.canvas işlevini rignore edin ve bir etiket oluşturun ve buna benzer bir görüntü ekleyin "self.photo" buna benzer : 'self.label = Tk.Label (self.parent, resim = self.photo)'. Ve kodun geri kalanını @DingoGetter –

    +0

    olarak saklayın Ayrıca şunu ekleyin: 'self.label.grid (row = 0, column = 0)'. Kodun geri kalanı olduğu gibi kalır, sadece 'self.canvas'ı kaldırır ve açıkladığım gibi yeni bir' Label() 'oluşturur. –

    0

    Yukarıdaki swers derinden muhteşemdi, tam durumuma uymuyorlardı (özellikle Python 2.7, vb.).

    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) 
    

    dikdörtgen kullanarak tuval üzerinde eklenir::

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

    stipplethis örnekten geliyor, dikdörtgen şeffaflık eklemenize yardımcı olacak Ancak, bu çözüm aradığım tam olarak ne bana verdi.