基于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获取文件扩展名的方法
Jul 06 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
Python 如何查找特定类型文件
Aug 17 Python
python如何将图片转换素描画
Sep 08 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 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源代码
2006/10/09 PHP
smarty section简介与用法分析
2008/10/03 PHP
PHP学习笔记之二
2011/01/17 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
python集合用法实例分析
2015/05/30 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
南京软件公司的.net程序员笔试题
2014/08/31 面试题
nohup的用法
2012/11/26 面试题
十佳青年个人事迹材料
2014/01/28 职场文书
高校教师自荐信范文
2014/03/13 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
职工食堂管理制度
2015/08/06 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
Redis 限流器
2022/05/15 Redis
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android
mysql序号rownum行号实现方式
2022/12/24 MySQL