设计一个opencv交互程序,通过键盘与鼠标的组合控制显示至少四种的形状及三种不同样式的文字。
时间: 2024-03-01 22:51:32 浏览: 23
好的,我了解了您的问题。下面是一个简单的 OpenCV 交互程序,您可以通过键盘和鼠标来控制显示不同的形状和文字样式。
```python
import cv2
# 定义一些常量
WINDOW_NAME = "Interactive OpenCV"
SHAPE_TYPES = ["rectangle", "circle", "line", "triangle"]
FONT_TYPES = [cv2.FONT_HERSHEY_SIMPLEX, cv2.FONT_HERSHEY_COMPLEX, cv2.FONT_HERSHEY_TRIPLEX]
FONT_SIZES = [0.5, 1, 1.5]
FONT_COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
# 定义一些变量
current_shape = 0
current_font = 0
current_size = 0
current_color = 0
mouse_down = False
start_pos = (0, 0)
# 回调函数,用于处理键盘事件
def on_keyboard(event, x, y, flags, param):
global current_shape, current_font, current_size, current_color
if event == cv2.EVENT_KEYDOWN:
if flags & cv2.EVENT_FLAG_SHIFTKEY:
if flags & cv2.EVENT_FLAG_CTRLKEY:
if flags & cv2.EVENT_FLAG_ALTKEY:
# 按下 Shift + Ctrl + Alt + Q 退出程序
if param == ord("q"):
cv2.destroyAllWindows()
exit(0)
else:
# 按下 Shift + Ctrl + Q 切换字体颜色
if param == ord("q"):
current_color = (current_color + 1) % len(FONT_COLORS)
else:
# 按下 Shift + Q 切换字体大小
if param == ord("q"):
current_size = (current_size + 1) % len(FONT_SIZES)
else:
# 按下 Q 切换形状类型
if param == ord("q"):
current_shape = (current_shape + 1) % len(SHAPE_TYPES)
# 按下 W 切换字体类型
elif param == ord("w"):
current_font = (current_font + 1) % len(FONT_TYPES)
# 回调函数,用于处理鼠标事件
def on_mouse(event, x, y, flags, param):
global mouse_down, start_pos
if event == cv2.EVENT_LBUTTONDOWN:
mouse_down = True
start_pos = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
mouse_down = False
# 绘制形状
if current_shape == 0:
cv2.rectangle(image, start_pos, (x, y), FONT_COLORS[current_color], -1)
elif current_shape == 1:
cv2.circle(image, start_pos, max(abs(x - start_pos[0]), abs(y - start_pos[1])), FONT_COLORS[current_color], -1)
elif current_shape == 2:
cv2.line(image, start_pos, (x, y), FONT_COLORS[current_color], 2)
elif current_shape == 3:
pts = [start_pos, (x, y), (2 * start_pos[0] - x, y)]
cv2.fillConvexPoly(image, pts, FONT_COLORS[current_color])
elif event == cv2.EVENT_MOUSEMOVE:
# 绘制文字
if mouse_down:
cv2.putText(image, SHAPE_TYPES[current_shape], start_pos, FONT_TYPES[current_font], FONT_SIZES[current_size], FONT_COLORS[current_color], 2)
# 创建一个窗口
cv2.namedWindow(WINDOW_NAME)
# 绑定回调函数
cv2.setMouseCallback(WINDOW_NAME, on_mouse)
cv2.setMouseCallback(WINDOW_NAME, on_keyboard)
# 创建一个空白图像
image = cv2.imread("blank.png")
# 进入主循环
while True:
# 显示图像
cv2.imshow(WINDOW_NAME, image)
# 等待键盘输入
key = cv2.waitKey(20) & 0xff
# 处理键盘事件
on_keyboard(cv2.EVENT_KEYDOWN, 0, 0, cv2.EVENT_FLAG_SHIFTKEY, key)
```
这个程序创建了一个空白的图像,然后绑定了两个回调函数,分别用于处理鼠标事件和键盘事件。在鼠标事件回调函数中,我们根据当前选择的形状类型来绘制相应的形状,同时在鼠标移动时绘制当前选择的文字样式。在键盘事件回调函数中,我们根据按下的键来切换当前选择的形状类型、文字样式、字体大小和字体颜色。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)