基于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编写提取日志中的中文的脚本的方法
Apr 30 Python
python实现复制整个目录的方法
May 12 Python
python魔法方法-属性访问控制详解
Jul 25 Python
Python进程间通信Queue实例解析
Jan 25 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
Django 路由控制的实现
Jul 17 Python
python scrapy爬虫代码及填坑
Aug 12 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Python日志logging模块功能与用法详解
Apr 09 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 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
php扩展ZF――Validate扩展
2008/01/10 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
template.js前端模板引擎使用详解
2017/10/10 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
Python实现控制台进度条功能
2016/01/04 Python
在python中画正态分布图像的实例
2019/07/08 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
django在开发中取消外键约束的实现
2020/05/20 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
事业单位辞职信范文
2014/01/19 职场文书
运动会入场式解说词
2014/02/18 职场文书
教师自我鉴定范文
2014/03/20 职场文书
中学生演讲稿
2014/04/26 职场文书
法人代表证明书格式
2014/10/01 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
酒店开业主持词
2015/07/02 职场文书
高三教师工作总结2015
2015/07/21 职场文书
高一英语教学反思
2016/03/03 职场文书