1. 综述
Python是一种易于学习且功能强大的编程语言,适合各种领域的开发者使用。其中的OpenCV库更是开发者不可缺少的好帮手,可以应用于图像处理、计算机视觉等领域。在本文中,我们将学习如何使用Python和OpenCV库自制一款绘画板。
2. 环境搭建
2.1 安装Python
在开始本项目之前,我们需要先在我们的电脑上安装Python。Python的官网提供了各个版本的下载链接,我们可以选择适合我们电脑的版本进行下载。
重要内容:请确保您已经安装了Python环境
2.2 安装OpenCV库
Python中使用OpenCV库需要先将OpenCV库安装到我们的电脑中。在Python中使用以下命令安装OpenCV库:
pip install opencv-python
备注:如果pip无法正常使用,建议更新一下pip:
python -m pip install --upgrade pip
3. 绘画板实现
3.1 创建画布
首先,我们需要创建一个空的画布。在Python中,可以使用numpy库创建一个数组作为我们的画布。
import numpy as np
canvas = np.zeros((600,800,3), np.uint8)
这里我们使用了numpy的zeros()函数创建了一个600*800的像素数组,每一个像素的颜色值都是0。
3.2 监听鼠标事件
为了能够在画布上绘制图形,我们需要监听用户的鼠标事件。在OpenCV中,可以使用setMouseCallback()函数来实现鼠标事件的监听。
import cv2
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONUP:
cv2.circle(canvas, (x,y), 30, (0,0,255), -1)
cv2.namedWindow('canvas')
cv2.setMouseCallback('canvas', draw_circle)
while True:
cv2.imshow('canvas', canvas)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
在上述代码中,我们首先定义了一个叫做“draw_circle()”的函数,用来处理鼠标点击事件。当鼠标左键松开时,在画布上绘制一个红色的半径为30个像素的圆。
接下来创建了一个名为“canvas”的窗口,使用setMouseCallback()函数监听“canvas”窗口的鼠标事件,并且在界面中实时显示画布。最后,当我们按下“q”键时,窗口关闭。
3.3 支持画笔颜色和线条粗细调整
为了能够进行更多绘制操作,我们需要添加画笔颜色和线条粗细调整的功能。这里我们新增一个函数用来根据用户在画布上的操作,返回用户想要绘制的颜色和线条粗细。
color = (0,0,0)
thickness = 1
def change_color(event, x, y, flags, param):
global color
if event == cv2.EVENT_LBUTTONUP:
color = tuple(map(int, np.random.randint(0,255,3)))
cv2.namedWindow('palette')
cv2.setMouseCallback('palette', change_color)
while True:
palette = np.zeros((50,500,3), np.uint8)
palette[:] = color
cv2.imshow('palette', palette)
k = cv2.waitKey(1)
if k == ord('q'):
break
elif k == ord('+'):
thickness += 1
elif k == ord('-'):
thickness -= 1
cv2.destroyAllWindows()
在上述代码中,我们首先定义了一个全局变量color来表示用户选择的绘制颜色,默认为黑色,thickness来表示用户选择的线条粗细,默认为1。
接下来,我们创建了一个名为“palette”的窗口,用来显示颜色选择器。当用户在画布窗口中单击鼠标时,颜色选择器窗口将会显示新的随机颜色。
最后,我们使用cv2.waitKey()函数为用户提供了使用“+”和“-”来改变画笔粗细的快捷方式。
3.4 将所有组件整合到一起
现在我们已经实现了画布,鼠标事件监听,颜色选择器等功能,接下来我们需要将所有的组件整合到一起。
font = cv2.FONT_HERSHEY_SIMPLEX
instructions = np.zeros((50,800,3), np.uint8)
instructions = cv2.putText(instructions,'PRESS Q TO QUIT | + TO INCREASE THICKNESS | - TO DECREASE THICKNESS',(10,30), font, 0.5,(255,255,255),1,cv2.LINE_AA)
canvas = np.zeros((600,800,3), np.uint8)
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONUP:
cv2.circle(canvas, (x,y), thickness*5, color, -1)
cv2.namedWindow('canvas')
cv2.setMouseCallback('canvas', draw_circle)
cv2.namedWindow('palette')
cv2.setMouseCallback('palette', change_color)
while True:
instructions = np.zeros((50,800,3), np.uint8)
instructions = cv2.putText(instructions,'PRESS Q TO QUIT | + TO INCREASE THICKNESS | - TO DECREASE THICKNESS',(10,30), font, 0.5,(255,255,255),1,cv2.LINE_AA)
palette = np.zeros((50,500,3), np.uint8)
palette[:] = color
cv2.imshow('instructions', instructions)
cv2.imshow('palette', palette)
cv2.imshow('canvas', canvas)
k = cv2.waitKey(1)
if k == ord('q'):
break
elif k == ord('+'):
thickness += 1
elif k == ord('-'):
thickness -= 1
cv2.destroyAllWindows()
在上述代码中,我们将所有组件整合到一起。我们使用cv2.putText()函数创建了一条说明性文本,用来向用户阐明怎样退出绘画板和如何调整线条粗细。
接下来,我们创建了一个名为“canvas”的窗口,用来监听用户在画布上的绘画操作;创建了一个名为“palette”的窗口,用来提供颜色选择,当用户在画布上单击鼠标时,画布窗口将会在用户单击的地方绘制一个带有选择的粗细和颜色的圆。
最后,我们使用cv2.imshow()函数将所有组件的窗口整合在一起,并使用cv2.waitKey()函数为用户提供了一些快捷键操作,让用户可以调整画笔粗细和退出绘画板。
4. 总结
在本篇文章中,我们使用了Python和OpenCV库自制了一个绘画板,并且在绘画板上实现了颜色选择和线条粗细的调整功能。通过本篇文章的学习,我们不仅可以更好地理解Python和OpenCV库的应用,同时也可以更好地掌握如何使用Python和OpenCV库开发可视化软件。