基于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实现全角半角转换的方法
Aug 18 Python
Python中实现两个字典(dict)合并的方法
Sep 23 Python
Python实现去除代码前行号的方法
Mar 10 Python
Python MySQLdb Linux下安装笔记
May 09 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
python调用百度REST API实现语音识别
Aug 30 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
pytorch--之halfTensor的使用详解
May 24 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
PHP数字格式化
2006/12/06 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
php字符集转换
2017/01/23 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
JS中的作用域链
2017/03/01 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
Python内置函数的用法实例教程
2014/09/08 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
在线课程:Skillshare
2019/04/02 全球购物
大学三年的自我评价
2013/12/25 职场文书
小学生演讲稿大全
2014/04/25 职场文书
合作协议书格式
2014/08/19 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
解除租房协议书
2014/12/03 职场文书
体检通知范文
2015/04/21 职场文书
校长新学期致辞
2015/07/30 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL