基于opencv实现简单画板功能
作者:海底捞淡水鱼 发布时间:2022-08-25 14:41:41
标签:opencv,画板
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()
四、运行效果
五、总结
从这个简单的画板,我们主要学习运用了鼠标函数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()
来源:https://blog.csdn.net/qq_37030400/article/details/107729781
0
投稿
猜你喜欢
- 例子class A(object): def foo(self,x): print "exe
- 对大家推荐很好使用的MySql节点系统,像让大家对MySql节点系统有所了解,然后对MySql节点系统全面讲解介绍,希望对大家有用在向大家详
- 本文实例讲述了用python实现面向对像的ASP程序的方法。分享给大家供大家参考。具体实现方法如下:平时我们写ASP时,一般都用vbscri
- #共有方法 + * instra='人生苦短'strb='我用python'lista=list(range
- 环境搭建1.安装uwsgi、nginx和djangoapt install nginxpip install uwsgipip instal
- 从BbsXp提出来的生肖函数Zodiac(birthday)。使用方法:birthday为把要判断的出生时间,如2008-3-24 20:0
- '************************************* 'asp计算随机数&nb
- 1. 实验目的掌握最小二乘法求解(无惩罚项的损失函数)、掌握加惩罚项(2 范数)的损失函数优化、梯度下降法、共轭梯度法、理解过拟合、克服过拟
- 本文实例讲述了Python基于SMTP协议实现发送邮件功能。分享给大家供大家参考,具体如下:SMTP(Simple Mail Transfe
- 由于特定需求,最近实验室需要远程连接外地的sql server 2000服务器,最开始怎么连也连不上,出现了很多问题,但是在今天上午,借用实
- 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量,第二个是尽量降低单个对象向客户端同步的数据."九宫格"是最常
- 如果 replaceText 为函数,对于每一个匹配的子字符串,调用该函数时带有下面的 m+3 个参数,此处 m 是在 rgExp 中捕获的
- 最近在这找了好久的js菜单,都没找到满意的,今天找了个,觉得不错,最重要的是简单,希望大家可以参照一下先看看效果图吧:代码特点:js+css
- 通过 register_shutdown_function 方法,可以让我们设置一个当执行关闭时可以被调用的另一个函数。也就是说,当我们的脚
- 一、概述网络爬虫(Web crawler),又称为网络蜘蛛(Web spider)或网络机器人(Web robot),主要用来爬取目标网站内
- Django带来了一个高级的聚合生成框架,它使得创建RSS和Atom feeds变得非常容易。什么是RSS? 什么是Atom?RSS和Ato
- 去空格函数有如下两种:·LTRIM()LTRIM() 函数把字符串头部(左)的空格去掉,其语法如下:LTRIM (<character
- 一、前言在写业务代码时候,有许多场景需要重试某块业务逻辑,例如网络请求、购物下单等,希望发生异常的时候多重试几次。本文分享如何利用Pytho
- 使用到的库好多人都想了解一下如何对摄像头进行调用,然后进行目标检测,于是我做了这个小BLOG。opencv-python==4.1.2.30
- 平时我们获取事件对象一般写法如下:function getEvent(event) { return event