opencv的绘图与交互
1、绘直线
cv2.line(画布,起点坐标,终点坐标,颜色,宽度)
例子:cv2.line(image,(20,60),(300,400),(0,0,255),2)
2、绘矩形
cv2.rectange(画布,起点,终点,颜色,宽度)
若宽度大于0,标识边线宽度;如果小于0,表示画实心矩形
例子:cv2.rectangle(image,(20,60),(300,400),(255,0,0),-1)
3、绘圆形
cv2.circle(画布,圆心坐标,半径,颜色,宽度)
若宽度大于0,标识边线宽度;如果小于0,表示画实心圆行
例子:cv2.circle(image,(300,300),40,(0,255,0),2)
4、绘多边形
cv2.polylines(画布,点坐标列表,封闭,颜色,宽度)
点坐标列表是一个numpy类型的列表,需要导入numpy 包
import numpy
创建点坐标: pts = numpy.array([[20,60],[300,280],[150,200]],numpy.int32)
例子:cv2.rectangle(image,[pts],True,(0,0,255),2)
5、添加文字
cv2.putText(画布,文字,位置,字体,大小,颜色,文字粗细)
例子:cv2.putText(image,‘apple’,(350,200),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)
相关代码演示:
import cv2
import numpy
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
cv2.namedWindow("example.png") # 创建窗口
img = cv2.imread('example.png') # 读取图像
cv2.line(img, (50, 50), (300, 300), (255, 0, 0), 2) # 画直线
cv2.rectangle(img, (500, 20), (580, 100), (0, 255, 0), -1) # 画矩形
cv2.circle(img, (500, 300), 40, (255, 255, 0), -1) # 画圆形
pts = numpy.array([[300, 300], [300, 340], [350, 320]], numpy.int32) # 用numpy形成坐标列表
cv2.polylines(img, [pts], True, (0, 255, 255), 2) # 画多边形
cv2.putText(img, '测试', (350, 420), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 232, 133), 2)
cv2.imshow('example.png', img)
cv2.waitKey(0)
cv2.destroyWindow("example.png") # 关闭窗口
6、用鼠标做画笔
cv2.setMouseCallback()创建鼠标事件回调函数,当鼠标事件发生时就会被执行。可以通过鼠标事件获得相对应的图片上的坐标。
#查看所有的鼠标事件
import cv2
events=[i for i in dir(cv2) if 'EVENT' in i]
print(events)
相关代码:
创建了黑色画布,鼠标摁下时移动即可绘制图形,摁m键绘制矩形,摁q键退出
import cv2
import numpy as np
# 当鼠标按下时变为 True
drawing = False
# 如果 mode 为 true 绘制矩形。按下'm' 变成绘制曲线。 mode=True
ix, iy = -1, -1
# 创建回调函数 #回调函数包含两部分 一部分画矩形 一部分画圆圈
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
# 当按下左键是返回起始位置坐标
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
# 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing is True:
if mode is True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
# 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细
cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
# 下面注释掉的代码是起始点为圆心,起点到终点为半径的
# r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2))
# cv2.circle(img, (x, y), r, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP: # 当鼠标松开停止绘画。
drawing = False
img = np.zeros((512, 512, 3), np.uint8)
mode = False
cv2.namedWindow('image', 0)
cv2.setMouseCallback('image', draw_circle)
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) # & 0xFF
if k == ord('m'):
mode = not mode
elif k == ord("q"):
break
7、使用滚动条绑定窗口
学习函数cv2.createTrackbar()
import cv2
import numpy as np
def nothing(x):
pass
#创建一个黑色窗口
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# 创建改变颜色的滚动轮
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
# 创建一个滚动轮开关功能
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)
# 只有当 转换按钮 指向 ON 时 滑动条的滑动才有用,否则窗户 都是黑的。
while True:
# 获取四个滚动论的位置
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
s = cv2.getTrackbarPos(switch, 'image') # 另外一个重要应用就是用作转换按钮
if s == 0:
img[:] = 0
else:
img[:] = [b, g, r]
cv2.imshow('image', img)
k = cv2.waitKey(1) # & 0xFF
if k == ord("q"):
break
cv2.destroyAllWindows()
这篇博客详细介绍了如何使用OpenCV进行图像的绘图操作,包括直线、矩形、圆形、多边形以及文字的绘制。同时,展示了如何利用鼠标事件创建画笔功能,实现动态绘图。此外,还讲解了如何设置滚动条,通过它来改变图像的颜色。这些内容对于理解和实践OpenCV的图形交互非常有帮助。
1447

被折叠的 条评论
为什么被折叠?



