OpenCV必知必会的基础(二)
绘制基本图形
直线的绘制
- API:
cv2.line(img,pt1,pt2,color[,thickness[,lineType]])
- 参数说明:
- img: 画线的图像(numpy类型)
- pt1: 指定线开始的位置
- pt2: 指定线结束的位置
- color: 线的颜色设置如:thickness线的粗细,lineType线的类型
- 代码实例:
## 创建一个背景图片 img = np.zeros((640,480,3), np.uint8) ## 背景图片上画线(设置直线的起点,终点,以及颜色选择,线的粗细程度, 以及线边形状) cv2.line(img, (10,20), (10, 400), (0, 0 ,255), 5, 1) cv2.line(img, (60,20), (20, 200), (0, 255 ,255), 5, 1) ## 展示图片 cv2.imshow('draw',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
矩形的绘制
- API:
cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType]])
- 参数说明:
- img: 画线的图像(numpy类型)
- pt1: 指定矩形左顶点
- pt2: 指定矩形右顶点
- color: 线的颜色设置如:thickness线的粗细,lineType线的类型
- 代码实例:
## 创建一个背景图片 img = np.zeros((640,480,3), np.uint8) ## 背景图片上绘制矩形 cv2.rectangle(img,(10,10),(100,100),(255,0,0),-1) ## 展示图片 cv2.imshow('draw',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
圆的绘制
- API:
cv2.circle(img, center, radius, color[,thickness[,lineType]])
- 参数说明:
- img: 画线的图像(numpy类型)
- center: 圆心
- radius: 半径
- color: 线的颜色设置如:thickness线的粗细,lineType线的类型
- 代码实例:
## 创建一个背景图片 img = np.zeros((640,480,3), np.uint8) ## 背景图片上绘制圆 cv2.circle(img,(200,200),20,(0,255,0),3) ## 展示图片 cv2.imshow('draw',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
椭圆的绘制
- API:
cv2.ellipse(img,center,axes,angle,startAngle,endAngle)
- 参数说明:
- img: 画线的图像(numpy类型)
- center: 绘制椭圆的圆心位置
- axes: 绘制椭圆长短轴大小
- angle: 偏转角度
- startAngle: 两组参数只有在绘制扇形时使用,启始角度
- endAngle: 两组参数只有在绘制扇形时使用,终止角度
- 代码实例:
## 加载背景图片 img = np.ones((640,480,3),np.uint8) ## 在背景图片上绘制椭圆 cv2.ellipse(img,(100,100),(10,5),0,0,360,(0,255,0)) ## 展示图片 cv2.imshow('ellipse',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
多边形的绘制
- API:
cv2.polylines(img,pts,isClosed,color[,thickness[,lineType]])
- 参数说明:
- img: 画线的图像(numpy类型)
- pts: 多边形的各个顶点
- isClosed: 是否为闭合(bool类型)
- color: 线的颜色设置如:thickness线的粗细,lineType线的类型
- 代码实例:
## 创建一个背景图片 img = np.zeros((640,480,3), np.uint8) ## 背景图片上绘制多边形 # 随机初始化多边形顶点(注意顶点坐标数据类型必须是int32否则会报错) pts = np.array([(300,10), (150,100), (450, 100)], np.int32) cv2.polylines(img, [pts], True, (255,0,0)) ## 展示图片 cv2.imshow('draw',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
文本的绘制(字幕)
- API:
cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])
- 参数说明:
- img: 画线的图像(numpy类型)
- text: 绘制的字体(string类型)
- org: 绘制字体的位置,以文字的左下角为起点
- fontFace: 表示字体类型
- fontScale: 表示字体大小
- color: 线的颜色设置如:thickness线的粗细,lineType线的类型,bottomLeftOrigin 用于控制文字的方向。默认为False,当设置为True时,文字时垂直镜像效果
- 代码实例:
## 加载背景图片 img = np.zeros((480,640,3),np.uint8) ## 在背景图片中添加文字 cv2.putText(img, 'Hello World',(10,400), cv2.FONT_HERSHEY_PLAIN,1,(255,0,0)) ## 展示背景图片 cv2.imshow('text',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
课程大作业
模块介绍
需求分析
可以通过鼠标进行基本图形的绘制
- 可以画线:当用户按下 l l l 键,即选择了画线,此时,滑动鼠标即可画线
- 可以画矩形: 当用户按下 r r r 键,即选择了画线,此时,滑动鼠标即可画矩形
- 可以画圆形: 当用户按下 c c c 键,即选择了画线,此时,滑动鼠标即可画圆形
设置回调函数
设置鼠标事件,实现回调函数:参考我们电脑本地的画图软件,先按下鼠标的左键确定绘图的起点拖动,放开鼠标左键确定终点坐标,确定起点和终点的坐标即可绘制出相应的图形,这里我们以绘制线条/矩形/圆形为例子
# 全局变量(curshape=0画线/1画矩形/2画圆)
curshape = 0
## 全局变量起始坐标
startpos = (0,0)
## 回调函数
def mouse_callback(event,x,y,flags,userdata):
# 声明它是全局变量
global curshape,startpos
if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:
startpos = (x,y)
elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:
if curshape == 0:
# 选择画线
cv2.line(img,startpos,(x,y),(0,0,255))
elif curshape == 1:
# 选择画矩形
cv2.rectangle(img,startpos,(x,y),(255,0,255))
elif curshape == 2:
# 选择画圆
a = (x - startpos[0])
b = (y - startpos[1])
r = int((a**2+b**2)**0.5)
cv2.circle(img,startpos,r,(0,255,0))
else:
print('error: No Shape')
主程序
## 创建窗口
cv2.namedWindow('drawshape',cv2.WINDOW_NORMAL)
cv2.resizeWindow('drawshape',640,360)
## 设置鼠标事件
cv2.setMouseCallback('drawshape',mouse_callback)
## 显示窗口和背景
img = np.zeros((480,640,3),np.uint8)
while True:
cv2.imshow('drawshape',img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
elif key & 0xFF == ord('l'):
# 绘制直线
curshape = 0
elif key & 0xFF == ord('r'):
# 绘制矩形
curshape = 1
elif key & 0xFF == ord('c'):
# 绘制圆
curshape = 2
cv2.destroyAllWindows()