基于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写的Socks5协议代理服务器
Aug 06 Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
Python简单的制作图片验证码实例
May 31 Python
python正则实现计算器功能
Dec 14 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
Python3 log10()函数简单用法
Feb 19 Python
python nmap实现端口扫描器教程
May 28 Python
python 两个数据库postgresql对比
Oct 21 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 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加密扩展库Mcrypt安装和实例
2013/11/10 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
JS 常用校验函数
2009/03/26 Javascript
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python清除指定目录内所有文件中script的方法
2015/06/30 Python
python入门教程之识别验证码
2017/03/04 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
AUC计算方法与Python实现代码
2020/02/28 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
运动会广播稿300字
2014/01/10 职场文书
专业技术职务聘任书
2014/03/29 职场文书
公司建议书怎么写
2014/05/15 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL
Hive日期格式转换方法总结
2022/06/25 数据库