Size adım adım çözüm vereyim.
, 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ü:

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
"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 –
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. –