玩命加载中 . . .

OpenCV绘画板


初学OpenCV,有些知识点要通过练习去学习,因此会用学到的一些知识写一些简单的程序。
本篇文章是写一段绘画板的程序,用到的知识点有OpenCV鼠标操作绘图函数以及轨迹栏的使用,也包括一些其他OpenCV和NumPy的最基础的操作

基本思路

设计一个通过鼠标作画的程序,可以通过轨迹栏进行调色和模式调整等操作。共有三个模式,模式一是正常的绘画,可以用轨迹栏调整笔迹的粗细,模式二是画矩形,模式三是画圆。

鼠标操作

OpenCV中的鼠标操作主要通过cv2.setMouseCallback()函数实现。参数如下:

  1. 窗口名
  2. 鼠标响应处理函数
  3. 用户定义的传递到回调函数的参数,一般会省略

其中比较重要的是第二个响应处理函数的写法:

def func(event, x, y, flags, param)

event代表鼠标事件,比如滑动,点击,松开等等,是一瞬间的动作;而flags则代表鼠标状态,例如拖拽,按住不放等等:

轨迹栏

轨迹栏的使用涉及到两个函数:cv2.createTrackbar()cv2.getTrackbarPos(),它们的作用和参数分别如下:

绘图函数

绘图函数列举如下:

程序

学过这些知识后,写出这段程序就不算很难了,源码如下:

import numpy as np
import cv2 as cv

drawing = False
mode = 0
color = [0, 0, 0]
ix, iy = -1, -1


def draw(event, x, y, flags, param):
    global mode, drawing, ix, iy
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing:
            if mode == 0:
                cv.circle(img, (x, y), thickness, color, -1)
            elif mode == 1:
                cv.rectangle(img, (ix, iy), (x, y), color, -1)
            elif mode == 2:
                radius = 2 * ((x - ix) ** 2 + (y - iy) ^ 2) ** 0.5
                cv.circle(img, (ix, iy), int(radius), color, -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == 0:
            cv.circle(img, (x, y), thickness, color, -1)
        elif mode == 1:
            cv.rectangle(img, (ix, iy), (x, y), color, -1)
        elif mode == 2:
            radius = 2 * ((x - ix) ** 2 + (y - iy) ^ 2) ** 0.5
            cv.circle(img, (ix, iy), int(radius), color, -1)


def nothing(x):
    pass


img = np.zeros((640, 1024, 3), np.uint8)
img[:] = 255

swi = np.zeros((200, 500, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw)

cv.namedWindow('switch')
cv.createTrackbar('R', 'switch', 0, 255, nothing)
cv.createTrackbar('G', 'switch', 0, 255, nothing)
cv.createTrackbar('B', 'switch', 0, 255, nothing)
cv.createTrackbar('Thickness', 'switch', 1, 20, nothing)
mode_str = 'Mode:\n0 : line  1 : rect  2 : circle'
cv.createTrackbar(mode_str, 'switch', 0, 2, nothing)

while (1):
    cv.imshow('image', img)
    cv.imshow('switch', swi)
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
    r = cv.getTrackbarPos('R', 'switch')
    b = cv.getTrackbarPos('B', 'switch')
    g = cv.getTrackbarPos('G', 'switch')
    thickness = cv.getTrackbarPos('Thickness', 'switch')
    mode = cv.getTrackbarPos(mode_str, 'switch')
    color = [b, g, r]
    swi[:] = color
cv.destroyAllWindows()

运行结果如下:

画板,可以用鼠标作画

调色板和模式调整,主要是轨迹栏的使用

参考内容

opencv-python-tutroals-readthedocs-io-en-latest


文章作者: Mond
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Mond !
 上一篇
Arduino智能小车(三):PID算法简介 Arduino智能小车(三):PID算法简介
本篇文章是对PID算法的原理进行了一些探讨,并对其在Arduino智能车中的使用做了简单的介绍。如有纰漏,烦请指出
下一篇 
Apache2配置二级域名以及实现Https Apache2配置二级域名以及实现Https
本篇文章主要介绍如何在Aoache2下实现二级域名,并且部署SSL证书给该域名实现Https。本文是基于树莓派的Raspbian系统介绍,如果文中有问题,还请各位看官及时指正。
  目录