我正在使用Tkinter和grid()
布局管理器来创建GUI。我在选项卡窗口中使用标签在GUI中显示图像:
label2 = ttk.Label(tab2)
image2 = PhotoImage(file="lizard.gif")
label2['image'] = image2
label2.grid(column=0, row=0, columnspan=3)
为了说明,我们假设图像是300 x 900.如果我知道图像中的一组坐标,我如何在图像上叠加阴影框,由已知的(A,B, C,D仅用于说明目的)坐标?
答案 0 :(得分:2)
您需要使用画布小部件。这将允许您绘制图像,然后在其上叠加矩形。
答案 1 :(得分:1)
让我一步一步解决。
您可以使用tkinter.Label()
来显示图像,也可以选择其他小部件。但是对于情况,我们选择tkinter.Canvas()
小部件(但如果您选择使用tkinter.Label()
,则相同的推理有效)
您的问题包含2个要解决的主要子问题:
tkinter.Canvas()
为了能够读取 jpg 格式的图像,您需要使用特定的PIL(或其Pillow fork)方法和类:
这由以下程序中的3行完成:
self.im = Image.open(self.saved_image)
self.photo = ImageTk.PhotoImage(self.im)
然后在我们选择的self.photo
窗口小部件中显示self.canvas
:
self.canvas.create_image(0,0, anchor=tk.N+tk.W, image = self.photo)
其次,要重现您想要的效果,请使用cv2.addWeighted()
OpenCV方法。但我觉得你已经做到了。所以我只是告诉你程序的代码部分:
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)
我使用2种方法:
- __init__()
:准备帧并调用GUI初始化方法。
- initialize_user_interface()
:绘制GUI并执行先前的操作。
但是出于scalability的原因,最好创建一个单独的方法来处理图像的不同操作。
这是源代码(我使用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()
这是正在运行的程序的屏幕截图:
答案 2 :(得分:0)
虽然上面的答案非常深入,但它们并不符合我的确切情况(特别是使用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示例,以帮助为矩形添加透明度。