Python tkinter 打开本地图片进行矩形框标注

        经常会遇到json报文中有图片URL,以及ROI的坐标x、y、w、h,然后需要验证下这个框在图片的什么位置,一般时候只能根据坐标值定性目测下。最近用tkinter写了个打开本地图片并且将rect的坐标值标注在图片上的工具,这样就可以实现定量的分析了。Python需要的第三方库有:pillow,opencv。至于tkinter的那些基本知识,我就不提了。直接上代码吧。

from tkinter import *
from time import *
import tkinter.filedialog
import io
import cv2
from PIL import Image, ImageTk

root = Tk()
w_box = 1280
h_box = 640
root.title('RectOnPic Tool')
root.geometry('1280x640')
e = StringVar()
# print(e)
e_entry = Entry(root,  textvariable=e)
e_entry.grid(row=6, column=1, padx=10, pady=5)
# print(e_entry.get())
# root.resizable(0,0)
Label1 = Label(root, text='X:').grid(row=0, column=0)
Label2 = Label(root, text='Y:').grid(row=1, column=0)
v1 = StringVar()
p1 = StringVar()
v1.set(0)
p1.set(0)
submit_button = Button(root, text="选择文件", command=root.quit)
Label3 = Label(root, text='W:').grid(row=3, column=0)
Label4 = Label(root, text='H').grid(row=4, column=0)
v2 = StringVar()
p2 = StringVar()
v2.set(0)
p2.set(0)
e1 = Entry(root, textvariable=v1)
e2 = Entry(root, textvariable=p1)
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3 = Entry(root, textvariable=v2)
e4 = Entry(root, textvariable=p2)
e3.grid(row=3, column=1, padx=10, pady=5)
e4.grid(row=4, column=1, padx=10, pady=5)
global imgGl
imgGl = Label(root, image=None)
imgGl.place(x=300, y=0)

def resize(w_box, h_box, pil_image):
    w, h = pil_image.size
    f1 = 1.0 * w_box / w
    f2 = 1.0 * h_box / h
    factor = min([f1, f2])
    width = int(w * factor)
    height = int(h * factor)
    return pil_image.resize((width, height), Image.ANTIALIAS)

def choose_file():
    selectFileName = tkinter.filedialog.askopenfilename(title='选择文件')
    # print(selectFileName)
    e.set(selectFileName)

def showImg(img1):
    imgGl.config(image='')
    load = Image.open(img1)
    pil_image_resized = resize(w_box, h_box, load)
    render = ImageTk.PhotoImage(pil_image_resized)
    imgGl.image = render
    imgGl.config(image=render)

def showImgAgain(img2):
    img = cv2.imread(img2)
    x = float(e1.get())
    y = float(e2.get())
    w = float(e3.get())
    h = float(e4.get())
    size = img.shape
    sz0 = size[0]
    sz1 = size[1]
    cv2.rectangle(img, (int(x * sz1), int(y * sz0)), (int((x + w) * sz1), int((y + h) * sz0)), (0, 255, 0), 4)
    cv2.imwrite('completed.jpg', img)
    showImg('completed.jpg')


Button(root, text='退出', width=10, command=root.quit)\
    .grid(row=9, column=0, sticky=W, padx=10, pady=5)
Button(root, text="选择文件", width=10, command=choose_file)\
    .grid(row=6, column=0, sticky=W, padx=10, pady=5)
Button(root, text="显示图片", width=10,command=lambda: showImg(e_entry.get()))\
    .grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text="画坐标框", width=10,command=lambda: showImgAgain(e_entry.get()))\
    .grid(row=8, column=0, sticky=W, padx=10, pady=5)

mainloop()

      建议用pycharm的开发环境打开,代码跑的结果如下:

效果图
代码运行效果图

如果想生成EXE文件,可以pip install pyinstaller 然后打开命令窗口执行下pyinstaller -F -w xxx.py 即可。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值