基于opencv实现简单画板功能


Posted in Python onAugust 02, 2020

OpenCV提供了很多简单的语句,实现复杂的功能,根据颜色和鼠标交互的基础语句,我们可以建立一个简单的画板。尽管它简单,但是制作的框架步骤不能少。

如果您感兴趣,可以按照我的步骤写一下,或者直接复制总程序中的代码运行。

一、功能

明确画板功能,便于后续编写程序。
目标功能:可调节颜色,有画图区域,可以进行鼠标输入。

二、框架搭建

主要有两步:

第一步:建立颜色选区,可以用OpenCV的滑动条语句cv.createTrackbar设置。cv.createTrackbar一共拥有五个参数设置,它们是(Trackbar名称,目标窗口名称,起始值-同时也是默认值,最大值,回调函数)。

#创建画布
img=np.zeros((300,512,3),np.uint8)
#给画布命名——需要提供给Trackbar
cv.namedWindow("image")
#创建RGB三种颜色的Trackbar,返回函数不需要做任何动作
cv.createTrackbar("R","image",0,255,nothing)
cv.createTrackbar("G","image",0,255,nothing)
cv.createTrackbar("B","image",0,255,nothing)
#由于OpenCv里面无按钮函数,所以用0/1来表示开关
switch="0:OFF\n1:ON"
cv.createTrackbar(switch,"image",0,1,nothing)
#回调函数,不需要做任何操作
def nothing(x):
 pass

第二步:捕捉鼠标动作状态,根据鼠标动作,实现在画图区域画出图形。常见的鼠标操作语句,可以使用语句*events = [i for i in dir(cv) if ‘EVENT' in i]*在python内查看。

#设置一个是否开始画画的开关
drawing=False
#定义画画函数
def draw(event,x,y,flag,param):
 #将画画开关作为全局变量,以便于在每次动作以后改变它的值
 global drawing
 #使用函数cv.EVENT_LBUTTONDOWN,如果鼠标左键按下,画圆,同时drawing为真
 if event==cv.EVENT_LBUTTONDOWN:
  cv.circle(img,(x,y),3,(g,b,r),-1)
  drawing=True
 #如果鼠标移动,进行下面操作
 elif event==cv.EVENT_MOUSEMOVE:
  #如果drawing为真,开始画圆
  if drawing==True:
   cv.circle(img, (x, y), 3, (g, b, r), -1)
 #如果鼠标左键抬起,画最后一个圆,并将drawing设为False,此时就会停止画画
 elif event==cv.EVENT_LBUTTONUP:
  cv.circle(img,(x,y),3,(g,b,r),-1)
  drawing=False

三、主函数

主函数就是对上述两部分进行整合。

while(1):
 #展示画布
 cv.imshow("image",img)
 #设置终止按钮,为了保证在32/64位系统或者在不是ASCII编码的键盘上有正常的操作,使用&0xFF取低八位
 k=cv.waitKey(1)&0xFF
 #如果k为27,即键盘上Esc的ASCII编码序号,退出画板
 if k==27:
  break
 #获取每个Trackbar中的值
 r=cv.getTrackbarPos("R","image")
 g = cv.getTrackbarPos("G", "image")
 b = cv.getTrackbarPos("B", "image")
 s = cv.getTrackbarPos(switch, "image")
 #如果开关是0,清空画板并禁止画画,如果是1,则允许
 if s==0:
  img[:]=0
 else:
  cv.setMouseCallback("image", draw)
#最后不要忘记销毁窗口
cv.destroyAllWindows()

四、运行效果

基于opencv实现简单画板功能

五、总结

从这个简单的画板,我们主要学习运用了鼠标函数cv.setMouseCallback,还有cv.createTrackbar这两个基本的OpenCV函数,并探索了其中的细节,找到了其中需要注意的地方。

六、总程序

import cv2 as cv
import numpy as np

def nothing(x):
 pass
img=np.zeros((300,512,3),np.uint8)
cv.namedWindow("image")
cv.createTrackbar("R","image",0,255,nothing)
cv.createTrackbar("G","image",0,255,nothing)
cv.createTrackbar("B","image",0,255,nothing)
switch="0:OFF\n1:ON"
cv.createTrackbar(switch,"image",0,1,nothing)

drawing=False
def draw(event,x,y,flag,param):
 global drawing
 if event==cv.EVENT_LBUTTONDOWN:
  cv.circle(img,(x,y),3,(g,b,r),-1)
  drawing=True
 elif event==cv.EVENT_MOUSEMOVE:
  if drawing==True:
   cv.circle(img, (x, y), 3, (g, b, r), -1)
 elif event==cv.EVENT_LBUTTONUP:
  cv.circle(img,(x,y),3,(g,b,r),-1)
  drawing=False

while(1):
 cv.imshow("image",img)
 k=cv.waitKey(1)&0xFF
 if k==27:
  break
 r=cv.getTrackbarPos("R","image")
 g = cv.getTrackbarPos("G", "image")
 b = cv.getTrackbarPos("B", "image")
 s = cv.getTrackbarPos(switch, "image")
 if s==0:
  img[:]=0
 else:
  cv.setMouseCallback("image", draw)
cv.destroyAllWindows()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python求解平方根的方法
Mar 11 Python
python实现多线程网页下载器
Apr 15 Python
Python IDLE清空窗口的实例
Jun 25 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
python web框架中实现原生分页
Sep 08 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
详解Python设计模式之策略模式
Jun 15 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Django中template for如何使用方法
Jan 31 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 Python
django下创建多个app并设置urls方法
Aug 02 #Python
Django如何在不停机的情况下创建索引
Aug 02 #Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 #Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 #Python
Flask缓存静态文件的具体方法
Aug 02 #Python
Flask中sqlalchemy模块的实例用法
Aug 02 #Python
python线程里哪种模块比较适合
Aug 02 #Python
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
各种咖啡的英文名子是什么
2021/03/03 新手入门
php仿ZOL分页类代码
2008/10/02 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
js 深拷贝函数
2008/12/04 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python使用MONGODB入门实例
2015/05/11 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
介绍一下linux文件系统分配策略
2012/11/17 面试题
《绿色蝈蝈》教学反思
2014/03/02 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
购房协议书范本
2014/10/02 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
MySQL自定义函数及触发器
2022/08/05 MySQL