基于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标准库urllib2的一些使用细节总结
Mar 16 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
Python文件及目录操作实例详解
Jun 04 Python
Python3.6正式版新特性预览
Dec 15 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
python的concat等多种用法详解
Nov 28 Python
python矩阵的转置和逆转实例
Dec 12 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
pandas中ix的使用详细讲解
Mar 09 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实现四舍五入的方法小结
2015/03/03 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
PHP 实现缩略图
2021/03/09 PHP
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
深入理解js promise chain
2016/05/05 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
解决Python传递中文参数的问题
2015/08/04 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
python构建指数平滑预测模型示例
2019/11/21 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
PHP面试题大全
2015/10/16 面试题
"引用"与多态的关系
2013/02/01 面试题
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
策划助理岗位职责
2013/11/18 职场文书
外语学院毕业生的自我鉴定
2013/11/28 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python