
基于Opencv的鼠标绘图程序
基于 OpenCV 的鼠标绘图程序详解
在计算机视觉和图像处理领域,OpenCV 是一个强大且广泛使用的库。今天,我们将深入探讨一个基于 OpenCV 的鼠标绘图程序,它可以让你在图像上自由绘制圆形,并通过滑块调整颜色和半径,还能一键清空画布。
代码整体功能概述
这段代码利用 Python 和 OpenCV 库实现了一个交互式绘图程序。程序创建了一个全白的 640x640 图像作为画布,用户可以通过鼠标在图像上绘制圆形,并且可以通过滑动条调整圆形的颜色(RGB)和半径,同时还提供了清空画布的功能。
代码详细分析
1. 导入必要的库
import cv2
import numpy as np
import math
这里导入了三个库:cv2 是 OpenCV 库,用于图像处理和显示;numpy 是用于数值计算和数组操作的库;math 库提供了数学相关的函数,但在这段代码中未实际使用。
2. 创建全白背景图像
img = np.full((640, 640, 3), 255, np.uint8)
使用 numpy 的 full 函数创建一个 640x640 的三维数组,每个元素的值为 255,即全白的图像。np.uint8 表示每个像素的取值范围是 0 - 255。
3. 定义鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
R = cv2.getTrackbarPos("R", "mouse")
G = cv2.getTrackbarPos("G", "mouse")
B = cv2.getTrackbarPos("B", "mouse")
r = cv2.getTrackbarPos("r", "mouse")
g = cv2.getTrackbarPos("g", "mouse")
if g == 1:
img[::] = 255
if flags == 1:
cv2.circle(img, (x, y), r, (R, G, B), -1)
R,G,B:通过cv2.getTrackbarPos函数获取滑动条“R”、“G”、“B”的当前值,用于确定圆形的颜色。r:获取滑动条“r”的当前值,用于确定圆形的半径。g:获取滑动条“g”的当前值,如果为 1,则将图像重置为全白,实现清空画布的功能。flags == 1表示鼠标左键被按下并拖动,此时在鼠标当前位置绘制圆形。
4. 创建窗口和滑动条
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
def callback(x):
pass
cv2.createTrackbar("R", "mouse", 0, 255, callback)
cv2.createTrackbar("G", "mouse", 0, 255, callback)
cv2.createTrackbar("B", "mouse", 0, 255, callback)
cv2.createTrackbar("r", "mouse", 0, pow(10, 2), callback)
cv2.createTrackbar("g", "mouse", 0, 1, callback)
cv2.namedWindow:创建一个名为“mouse”的窗口,cv2.WINDOW_NORMAL表示窗口可以调整大小。cv2.createTrackbar:创建滑动条,分别用于调整颜色(R、G、B)、半径(r)和清空画布(g)。callback是一个空函数,用于处理滑动条值的变化,但在这段代码中没有实际操作。
5. 主循环
while True:
cv2.imshow("mouse", img)
cv2.setMouseCallback('mouse', mouse_callback, RGB)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.imshow:在窗口中显示图像。cv2.setMouseCallback: 鼠标回调函数
写下一条关键结论
mouse_callback绑定到“mouse”窗口,当鼠标在窗口中发生事件时,会调用该函数。
cv2.waitKey(1):等待 1 毫秒,如果按下“q”键,则退出循环。
代码运行效果
运行这段代码后,会弹出一个窗口,窗口中有五个滑动条。你可以通过滑动“R”、“G”、“B”滑动条来选择圆形的颜色,滑动“r”滑动条来调整圆形的半径。当你按下鼠标左键并拖动时,会在鼠标位置绘制圆形。如果你将“g”滑动条的值设置为 1,画布将被清空。
总结
通过这段代码,我们可以看到 OpenCV 库在图像处理和交互式绘图方面的强大功能。利用鼠标回调函数和滑动条,我们可以实现一个简单而有趣的绘图程序。你可以根据自己的需求对代码进行扩展,例如添加更多的绘图工具(如矩形、直线等),或者实现更复杂的交互功能。 这段小程序可以作为Opencv学习过程中的一次小结, 希望这篇博客能帮助你理解和掌握基于 OpenCV 的鼠标绘图程序,让你在图像处理的世界中尽情发挥创意!