OpenCV +Python 制作画板
首先声明一下,本例思路不是博主原创,博主在前人的代码上进行了个性化的修改,制作了一个简单的画图工具。下面附上自己的理解,与君共勉。
效果图
画图工具实现
代码
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/14'
# __Desc__ = opencv实现的画板
import cv2
def blankcallback(position):
print '滚动条当前位置为%d'%position
# 当鼠标按下时设置 要进行绘画
drawing = False
# 如果mode为True时就画矩形,按下‘m'变为绘制曲线
mode = True
# globalx, globaly = -1,-1
# 创建回调函数,用于设置滚动条的位置
def drawcircle(event,x,y,flags,param):
r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
color = (b,g,r)
global globalx,globaly,drawing,mode
# 当按下左键时,返回起始的位置坐标
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
# globaly,globaly = x,y
# 当鼠标左键按下并移动则是绘画圆形,event可以查看移动,flag查看是否按下
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
# cv2.rectangle(img,(globalx,globaly),(x,y),color,-1)
cv2.rectangle(img, (x,y), (x, y), color, -1)
else:
# 绘制圆圈,小圆点连接在一起成为线,1代表了比划的粗细
cv2.circle(img,(x,y),1,color,-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = cv2.imread('me.jpg')
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.createTrackbar('R','image',0,255,blankcallback)
cv2.createTrackbar('G','image',0,255,blankcallback)
cv2.createTrackbar('B','image',0,255,blankcallback)
cv2.setMouseCallback('image',drawcircle)
while True:
cv2.imshow('image',img)
key = cv2.waitKey(10)&0xFFF
if key == ord('m'):
mode = not mode
elif key == 27:
break
cv2.destroyAllWindows()
运行结果
在程序正常的跑起来之后,我们会用鼠标来改变滚动条的位置,这个时候就会触发滚动条内置的回调函数,在这里是blankcallback函数。因此我们可以在命令行中看到打印出的值。
D:\Software\Python2\python.exe E:/Code/Python/DataStructor/opencv/PaintBoard.py
滚动条当前位置为1
滚动条当前位置为0
滚动条当前位置为5
滚动条当前位置为10
滚动条当前位置为17
滚动条当前位置为28
···
···
滚动条当前位置为202
滚动条当前位置为206
滚动条当前位置为219
滚动条当前位置为223
滚动条当前位置为233
滚动条当前位置为238
滚动条当前位置为240
滚动条当前位置为242
滚动条当前位置为250
滚动条当前位置为253
滚动条当前位置为255
滚动条当前位置为0
Process finished with exit code 0
程序分析
本例中注释很清晰,基本上只需要对一些小技巧方面做些解释即可。
窗体自由度
默认创建的窗体大小不能改变,但是我们可以指定让其可以被自适应的改变。
# 第二个参数即可达到我们想要的窗体自适应的效果
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
如何退出程序
想必明眼的你已经看到:
while True:
cv2.imshow('image',img)
key = cv2.waitKey(10)&0xFFF
if key == ord('m'):
mode = not mode
elif key == 27:
break
这段代码的作用就是计算当前 键盘被按下的键的ASCII码的值,如果等于ESC键对应的值,说明要退出循环了。
滚动条相关
滚动条无非也就是创建和获取当前的滚动条的位置。
# 参数分别为: 滚动条的名称,附着的窗体的名称,默认初始位置,最大长度,回调函数
cv2.createTrackbar('R','image',0,255,blankcallback)
cv2.createTrackbar('G','image',0,255,blankcallback)
cv2.createTrackbar('B','image',0,255,blankcallback)
# 这里也有一个回调函数,只不过是针对于鼠标的回调函数
cv2.setMouseCallback('image',drawcircle)
里面的blankcallback回调函数是针对滚动条的一个回调函数,这里不需要做什么处理,仅仅是打印输出一些当前被操作的滚动条的位置而已。
而获取到相应的位置值也很方便。
r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
# 接下来会用于设置图层上画笔的颜色
color = (b,g,r)
支持的事件
因为是鼠标事件的监听,所以需要知道 系统支持哪些事件。
# 首先查看一下被支持的鼠标事件,以方便于进一步的操作
events = [i for i in dir(cv2) if 'EVENT' in i]
print events
输出结果为:
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEMOVE', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
OpenCV +Python 制作画板的更多相关文章
- OpenCV Python教程(3、直方图的计算与显示)
转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...
- 使用python制作ArcGIS插件(5)其他技巧
使用python制作ArcGIS插件(5)其他技巧 by 李远祥 使用python做插件开发,除了了解ArcToolBox工具之外,还需要在了解ArcPy的相关函数和接口.只有掌握了这些,才可以顺利的 ...
- 使用python制作ArcGIS插件(4)界面交互
使用python制作ArcGIS插件(4)界面交互 by 李远祥 插件界面部分,除了一开始在设计器中设计的这些界面元素之外,还可以与操作系统进行一些输入输出的交互,这部分的实现全部在pythonadd ...
- 使用python制作ArcGIS插件(3)ArcPy的使用说明
使用python制作ArcGIS插件(3)ArcPy的使用说明 by 李远祥 ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting 功能进而构 ...
- 使用python制作ArcGIS插件(2)代码编写
使用python制作ArcGIS插件(2)代码编写 by 李远祥 上一章节已经介绍了如何去搭建AddIn的界面,接下来要实现具体的功能,则到了具体的编程环节.由于使用的是python语言进行编程,则开 ...
- 使用python制作ArcGIS插件(1)工具介绍
使用python制作ArcGIS插件(1)工具介绍 by 李远祥 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作.相对于以往9.x系列,addin的无论是 ...
- python制作pdf电子书
python制作pdf电子书 准备 制作电子书使用的是python的pdfkit这个库,pdfkit是 wkhtmltopdf 的Python封装包,因此在安装这个之前要安装wkhtmltopdf 安 ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- 使用python制作时间戳转换工具
使用python制作时间戳转换工具 python 时间戳转日期 日期转时间戳 前言:作为一个程序员一般情况下,json和时间戳是常用的两个工具,我咨询过很多个朋友,他们一般都是通过在线工具对json进 ...
随机推荐
- 全球性WannaCry蠕虫勒索病毒感染前后应对措施
前言:针对WannaCrypt勒索病毒的讨论和技术文章是铺天盖地,大量的技术流派,安全厂家等纷纷献计献策,有安全厂家开发各种安全工具,对安全生态来说是一个好事,但对个人未必就是好事,我们国家很多用户是 ...
- shell入门笔记2:字符串、数组、echo与printf
说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell字符串 字符串可以用单引号,也可以用双引号,也可以不用引号. 1 #!/bin/bash 2 ...
- [Codeforces 940E]Cashback
Description 题库链接 给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段.对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{le ...
- [SCOI 2011]糖果
Description 题库链接 给出 \(N\) 个节点,节点有正点权, \(K\) 个三元组 \((X,A,B)\) 来描述节点点权之间的关系. 如果 \(X=1\) , 表示 \(A\) 的点权 ...
- [POI 2004]ZAW
Description 在 Byte 山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是 1 号点.两个洞室要么就通过隧道连接起来,要么就经过若干隧道间接的相连. 现在决 ...
- [Codeforces 873B]Balanced Substring
Description You are given a string s consisting only of characters 0 and 1. A substring [l, r] of s ...
- 计蒜客NOIP模拟赛(3)D2T1 小区划分
一条街道的两侧各连续坐落着 N 座单元楼.现在要为这些单元楼划分居民校区. 规则如下: 每个小区只能由同一侧连续的若干座单元楼组成.且两侧都恰有 K 个小区(每个小区至少有一栋楼). 两侧的小区划分规 ...
- 生物分子gene
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAAHoCAYAAABdBLmnAAAgAElEQVR4nOzdB5gsRfU+/kZyTiIgCJ
- ●BZOJ 4822 [Cqoi2017]老C的任务
题链: https://www.luogu.org/problemnew/show/P3755 (洛谷上数据范围给全了的) 题解: 树状数组,离线询问 (本来想弄一个二维树状数组/二维RMQ,然后直接 ...
- BZOJ3052(树上带修莫队)
树上莫队的基本思路是把树按dfs序分块,然后先按x所在块从小到大排序,再按y所在块从小到大排序,处理询问即可. 这道题带修改,再加一个时间维即可. 设块大小为T,那么时间复杂度为$O(nT+\frac ...