首先声明一下,本例思路不是博主原创,博主在前人的代码上进行了个性化的修改,制作了一个简单的画图工具。下面附上自己的理解,与君共勉。


效果图

画图工具实现

代码

# 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 制作画板的更多相关文章

  1. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...

  2. 使用python制作ArcGIS插件(5)其他技巧

    使用python制作ArcGIS插件(5)其他技巧 by 李远祥 使用python做插件开发,除了了解ArcToolBox工具之外,还需要在了解ArcPy的相关函数和接口.只有掌握了这些,才可以顺利的 ...

  3. 使用python制作ArcGIS插件(4)界面交互

    使用python制作ArcGIS插件(4)界面交互 by 李远祥 插件界面部分,除了一开始在设计器中设计的这些界面元素之外,还可以与操作系统进行一些输入输出的交互,这部分的实现全部在pythonadd ...

  4. 使用python制作ArcGIS插件(3)ArcPy的使用说明

    使用python制作ArcGIS插件(3)ArcPy的使用说明 by 李远祥 ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting 功能进而构 ...

  5. 使用python制作ArcGIS插件(2)代码编写

    使用python制作ArcGIS插件(2)代码编写 by 李远祥 上一章节已经介绍了如何去搭建AddIn的界面,接下来要实现具体的功能,则到了具体的编程环节.由于使用的是python语言进行编程,则开 ...

  6. 使用python制作ArcGIS插件(1)工具介绍

    使用python制作ArcGIS插件(1)工具介绍 by 李远祥 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作.相对于以往9.x系列,addin的无论是 ...

  7. python制作pdf电子书

    python制作pdf电子书 准备 制作电子书使用的是python的pdfkit这个库,pdfkit是 wkhtmltopdf 的Python封装包,因此在安装这个之前要安装wkhtmltopdf 安 ...

  8. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  9. 使用python制作时间戳转换工具

    使用python制作时间戳转换工具 python 时间戳转日期 日期转时间戳 前言:作为一个程序员一般情况下,json和时间戳是常用的两个工具,我咨询过很多个朋友,他们一般都是通过在线工具对json进 ...

随机推荐

  1. java之设计模式工厂三兄弟之工厂方法模式

    [学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...

  2. [LeetCode] Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  3. [JSOI2007]字符加密

    题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...

  4. 安装ipython,使用scrapy shell来验证xpath选择的结果 | How to install iPython and how does it work with Scrapy Shell

    1. scrapy shell 是scrapy包的一个很好的交互性工具,目前我使用它主要用于验证xpath选择的结果.安装好了scrapy之后,就能够直接在cmd上操作scrapy shell了. 具 ...

  5. Linux下date使用

    [root@host1 ~]# date #显示时间 2017年 06月 01日 星期四 17:02:59 CST 以指定格式显示时间: [root@host1 ~]# date +%Y%m%d 20 ...

  6. 如何彻底删除mysql

    MySQL的卸载确实很让人头疼,很多时候都无法彻底卸载干净,这样会导致我们无法重新安装新的MySQL. 下面介绍,在Windows10系统下,如何彻底删除卸载MySQL... 1>停止MySQL ...

  7. 自然语言处理工具:中文 word2vec 开源项目,教程,数据集

    word2vec word2vec/glove/swivel binary file on chinese corpus word2vec: https://code.google.com/p/wor ...

  8. ajax中基本参数应用

    $(function () { $("#verificationCodeBtn").click(function () { $("#verificationCodeIma ...

  9. 关于一些基础的Java问题的解答(六)

    26. ThreadPool用法与优势 ThreadPool即线程池,它是JDK1.5引入的Concurrent包中用于处理并发编程的工具.使用线程池有如下好处: 降低资源消耗:通过重复利用已创建的线 ...

  10. 如何用cmd通过sublime打开文件?

    sublime 提供了专门的命令工具subl.exe,就在它的安装目录之下,讲安装目录配置到系统环境变量中就OK了.具体如下: 1.找到sublime安装路径 如我的默认路径:C:\Program F ...