基于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实现探测socket和web服务示例
Mar 28 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
python requests爬取高德地图数据的实例
Nov 10 Python
python实现日志按天分割
Jul 22 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
Python中免验证跳转到内容页的实例代码
Oct 23 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
python3 sqlite3限制条件查询的操作
Apr 07 Python
python中sys模块的介绍与实例
Apr 17 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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
Sony CFR 320 修复改造
2020/03/14 无线电
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python功能键的读取方法
2015/05/28 Python
python删除列表内容
2015/08/04 Python
Python中取整的几种方法小结
2017/01/06 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
2014年社区庆元旦活动方案
2014/03/08 职场文书
教师求职信范文
2014/05/24 职场文书
雷人标语集锦
2014/06/19 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电
mysql中关键词exists的用法实例详解
2022/06/10 MySQL