这两天看opencv-python的HSV色彩空间,在写程序时发现用HSV来提取图像区域是件令人恶心的麻烦事。拿阈值分割做个对比,阈值最多也就一两个参数需要调整;但是HSV需要对三个通道调整上下限,也就是起码有6个参数。于是乎,就一时兴起决定做个小程序,把参数都做成滑动块,这样自然方便许多。一开始,想直接用opencv来做,但是百度了一下它没有很好的GUI支持。所以决定还是用python自带的tkinter来设计UI。

UI设计最重要的还是布局,之前学CSS就差点搞得我稀里糊涂。tkinter有三种布局方式,网上说grid是常用的,然而我用了一会,感觉这种excel类型的方法有点死板,唯一的好处是不用计算坐标,所以我布局滑块时就使用了grid,其他一律使用place。

我要的程序界面得划出两块地方显示图片,tkinter没有专用的控件,不过可以利用Lable的image属性来设置背景图片。并且,image属性对图片数据流的格式有所要求,得用PIL模块里的Image和ImageTk两个工具先对图片进行处理。在处理时,我还得对它大小限制一下,要不然不同图片导进来,布局就乱了。接下来就导入滑块和按钮,调一下布局罢了,没啥难度,就是审美得纠结一下。所有控件都导入以后,为了看起来不那么单调,本来想是给整个窗口加一个高雅的背景图的,但是当我把背景改成暗灰色以后,奇迹就发生了——这东西居然还有border。暗灰色背景,配上亮白色边框,别有一番味道啊!!

最后,在给按钮和字调下颜色,然后把窗口的默认ico图标换一下,这还是跟之前的图片导入类似,所以很快就解决了。剩下的事情就是事件控制了,因为按钮挺多的,功能也越想越复杂,因此,这部分代码就留给以后写,文末贴个程序界面截图和实现代码。

 import os
from tkinter import *
from PIL import Image, ImageTk os.chdir('D:/programe/matlab/img') class GUI():
def __init__(self,window):
self.window = window
#title
self.window.title("HsvMaster")
#siz=800*600,position=(500,200)
self.window.geometry('1000x600+500+200')
self.window["bg"] = "DimGray"
# icon
self.icon = ImageTk.PhotoImage(file='hsv_icon.ico')
self.window.call('wm','iconphoto',self.window._w,self.icon) def create_widgets(self): #scale
self.hmin_label = Label(self.window,text='色调下限',fg='WhiteSmoke',bg="DimGray")
self.hmin_scale = Scale(self.window,orient=HORIZONTAL,from_=0,to=255,resolution=1,tickinterval=50,length=200,width=7,fg='WhiteSmoke',bg="DimGray")
self.hmax_label = Label(self.window,text='色调上限',fg='WhiteSmoke',bg="DimGray")
self.hmax_scale = Scale(self.window,orient=HORIZONTAL,from_=0,to=255,resolution=1,tickinterval=50,length=200,width=7,fg='WhiteSmoke',bg="DimGray")
self.smin_label = Label(self.window,text='饱和度下限',fg='WhiteSmoke',bg="DimGray")
self.smin_scale = Scale(self.window,orient=HORIZONTAL,from_=0,to=255,resolution=1,tickinterval=50,length=200,width=7,fg='WhiteSmoke',bg="DimGray")
self.smax_label = Label(self.window,text='饱和度上限',fg='WhiteSmoke',bg="DimGray")
self.smax_scale = Scale(self.window,orient=HORIZONTAL,from_=0,to=255,resolution=1,tickinterval=50,length=200,width=7,fg='WhiteSmoke',bg="DimGray")
self.vmin_label = Label(self.window,text='明度下限',fg='WhiteSmoke',bg="DimGray")
self.vmin_scale = Scale(self.window,orient=HORIZONTAL,from_=0,to=255,resolution=1,tickinterval=50,length=200,width=7,fg='WhiteSmoke',bg="DimGray")
self.vmax_label = Label(self.window,text='明度上限',fg='WhiteSmoke',bg="DimGray")
self.vmax_scale = Scale(self.window,orient=HORIZONTAL,from_=0,to=255,resolution=1,tickinterval=50,length=200,width=7,fg='WhiteSmoke',bg="DimGray") # scale position
self.hmin_label.grid(row=0, column=0,padx=15)
self.hmin_scale.grid(row=0,column=1,pady=2)
self.hmax_label.grid(row=1, column=0)
self.hmax_scale.grid(row=1,column=1,pady=2)
self.smin_label.grid(row=2, column=0)
self.smin_scale.grid(row=2,column=1,pady=2)
self.smax_label.grid(row=3, column=0)
self.smax_scale.grid(row=3,column=1,pady=2)
self.vmin_label.grid(row=4, column=0)
self.vmin_scale.grid(row=4,column=1,pady=2)
self.vmax_label.grid(row=5, column=0)
self.vmax_scale.grid(row=5,column=1,pady=2) #img
self.img = Image.open('man.jpg')
self.img = self.img.resize((300, 300))
self.img = ImageTk.PhotoImage(self.img) self.orign = Label(self.window,image=self.img,width=300,height=300)
self.work = Label(self.window,image=self.img,width=300,height=300)
#img position
self.orign.place(x=320, y=30)
self.work.place(x=650,y=30) #Button
self.import_button = Button(self.window, text='导入原图',font=('隶书',45), height=2, width=9,fg='WhiteSmoke',bg="BurlyWood")
self.clear_button = Button(self.window, text='删除所有',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood")
self.delete_button = Button(self.window, text='删除当前',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood")
self.switch_button = Button(self.window,text='区域切换',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood")
self.save_button = Button(self.window, text='区域暂存',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood")
self.merge_button = Button(self.window, text='合并区域',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood")
self.picture_button = Button(self.window, text='生成图片',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") #button position
self.import_button.place(x=18,y=400)
self.clear_button.place(x=370,y=420)
self.delete_button.place(x=570,y=420)
self.switch_button.place(x=770,y=420)
self.save_button.place(x=370,y=500)
self.merge_button.place(x=570,y=500)
self.picture_button.place(x=770,y=500) def gui_start(): my_window = Tk()
my_gui = GUI(my_window)
my_gui.create_widgets()
my_window.mainloop() gui_start()

opencv+tkinter制作HsvMaster(一)的更多相关文章

  1. OpenCV +Python 制作画板

    效果图 画图工具实现 代码 运行结果 程序分析 窗体自由度 如何退出程序 滚动条相关 支持的事件 首先声明一下,本例思路不是博主原创,博主在前人的代码上进行了个性化的修改,制作了一个简单的画图工具.下 ...

  2. Tkinter制作简单的python编辑器

    想要制作简单的python脚本编辑器,其中文字输入代码部分使用Tkinter中的Text控件即可实现. 但是问题是,如何实现高亮呢?参考python自带的编辑器:python27/vidle文件夹中的 ...

  3. python3+opencv+tkinter开发简单的人脸识别小程序

    学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...

  4. 用tkinter制作签名设计窗口

    效果如下: from tkinter import * from tkinter import messagebox import requests import re from PIL import ...

  5. python+tkinter制作一个可自定义的动态时钟及详细解释,珍藏版

    1.效果图 2.完整代码 #第1步:导出模块 from tkinter import * import math,time #第2步:定义窗口的相关设置 root = Tk() root.title( ...

  6. opencv函数制作的时钟模型

    http://www.cnblogs.com/sytu/p/4192652.html 在秒针模型的基础上添加了分针和时针,并且添加了暂停控件和设置时间的功能. #include"cv.h&q ...

  7. opencv函数制作的秒针模型

    曾经做过,没想到这次再次写这篇代码却用了这么久的时间.这回我要记住他. #include"cv.h" #include"highgui.h" int main( ...

  8. *#【Python】【基础知识】【模块】【tkinter】【学用tkinter画图/制作窗口】

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 . Tk ...

  9. 《OpenCV图像处理编程实例》

    <OpenCV图像处理编程实例>例程复现 随书代码下载:http://www.broadview.com.cn/28573 总结+遇到的issue解决: 第一章 初识OpenCV 1.VS ...

随机推荐

  1. 使用kali中的Metasploit通过windows7的永恒之蓝漏洞攻击并控制win7系统(9.27 第十三天)

    1.开启postgresql数据库 2.msfconsole 进入MSF中 3.search 17-010 搜索cve17-010相关的exp auxiliary/scanner/smb/smb_ms ...

  2. CodeForces - 402B Trees in a Row (暴力)

    题意:给定n个数,要求修改其中最少的数,使得这n个数满足ai + 1 - ai = k. 分析: 暴力,1000*1000. 1.这n个数,就是一个首项为a1,公差为k的等差数列.k已知,如果确定了a ...

  3. Egret Engine 2D - 缩放模式和旋转模式说明

    缩放模式和旋转模式说明 缩放模式showAll 常用 noScale noBorder exactFit 次常用 fixedWidth fixedHeight fixedNarrow fixedWid ...

  4. oracle查询语句注意事项:

    我想查出datatype 不等于1的所有结果,包括空. '; //这条sql查不出datatype为空的数据 发现oracle需要使用  is  null  .is  not null查询空或非空 ' ...

  5. Python Learning Day6

    selenium操作 点击.清除操作 from selenium import webdriver from selenium.webdriver.common.keys import Keys im ...

  6. java集合对象区别一

    Vector和ArrayList 1.vector是线程同步的,所以他也是线程安全的,而ArrayList是线程异步的,是不安全的.如果不考虑到线程的安全因素,一般用ArrayList效率较高. 2. ...

  7. Navicat for Mysql 11.2 的下载,安装与激活

    1. Navicat for Mysql 11.2 的下载 链接:https://pan.baidu.com/s/1w54F-MYTLuy4TQwpzUE7bQ       密码:zsfu 2.下载的 ...

  8. Q1:Two Sum

    1. Two Sum 官方的链接:1. Two Sum Description : Given an array of integers, return indices of the two numb ...

  9. Springboot过滤器注解简笔

    对多个过滤的注解      @WebFilter(filterName="FirstFilter",urlPatterns={"*.do","*.js ...

  10. 1.4CAD2017绘图基础

    1.新建(ctrl+n) 命令:new 回车——默认样板(acadiso.dwt) 2.打开(ctr+o) 3.保存(ctrl+S) 4.鼠标的应用: 左键:点击拖选等: 中间滚轮:a.滚动,放大缩小 ...