画线,画矩形,画圆,画椭圆,画多边形,绘制字体
画线的API: line(img,开始点,结束点,颜色……)
img:在哪张图像上画线
开始点,结束点:指定线的开始与结束位置
颜色,线宽(-1线宽是填充),线型
shift:坐标比例缩放(使用默认值就可以)
import cv2
import numpy as np
#先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)
# 画线,坐标电为(x,y) 图像,起始点,终止点,颜色,线宽,线的种类
cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
cv2.line(img, (80, 100), (300, 480), (255, 0, 0), 5, 16)
cv2.imshow('draw', img)
cv2.waitKey(0)
?cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4) 我们画线时这几个参数要了解,5代表的是我们画出图形的线宽,而4是我们画出图像的线型(4带有锯齿,可以与12对比)
绘制矩形API :rectang(img,起始点,终止点,颜色,线宽)
img:在哪张图像上画线
起始点,终止点:就是矩形对角的点位置
import cv2
import numpy as np
# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)
# 画矩形
cv2.rectangle(img, (10, 10), (100, 100), (0, 0, 255), -1)
cv2.imshow('draw', img)
cv2.waitKey(0)
绘制圆形API:circle(img,中心点,半径,颜色,……)
img:在哪张图像上画线
中心点:绘制的圆的中点
半径:绘制的圆的半径
import cv2
import numpy as np
# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)
# 画圆
cv2.circle(img, (320, 240), 100, (0, 0, 255))
cv2.circle(img, (320, 240), 5, (0, 0, 255), -1) # -1是填充
cv2.imshow('draw', img)
cv2.waitKey(0)
绘制椭圆API
ellipse(img,中心点,长度的一半,角度,从哪个角度开始,到哪个角度结束……)
img:在哪张图像上画线
中心点:和圆类似,也有一个中心点
长度的一半:其实指的是椭圆外接矩阵长和宽的一半,也就是设置下图中的x和y
?角度:角度值的也是外接矩形的角度
在进行实战之前我们思考,如果想画一个椭圆(在长为200,宽为100的矩形中)如何设定参数?
import cv2
import numpy as np
#先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)
#画椭圆
#图像名称 中心点 椭圆长宽的一半(外界长方形的长宽的一半) 外接矩形的起始位置 椭圆的起始点沿顺时针旋转的角度 椭圆旋转的角度 颜色 线形
cv2.ellipse(img,(320,240),(100,50),0,0,360,(0,0,255),1)
cv2.imshow('draw', img)
cv2.waitKey(0)
此时我们观察到椭圆画出来了,但是我们需要思考代码中的? 0,0,360 代表什么含义
cv2.ellipse(img,(320,240),(100,50),0,0,360,(0,0,255),1)
我们可以对其进行修改,先对0,0,360后面两个值进行修改。修改成0,0,180
cv2.ellipse(img,(320,240),(100,50),0,0,180,(0,0,255),1)
发现只画出了半个椭圆,所以可以明白,后面的两个数据就是在API中提到的(从哪个角度开始,到哪个角度结束)。
接下来先对0,0,360前一个值进行修改。修改成90,0,360
cv2.ellipse(img,(320,240),(100,50),90,0,360,(0,0,255),1)
发现整个椭圆顺时针旋转了90度,也就是在API部分提到的矩形先旋转90度,再在旋转后的矩形中画椭圆。
绘制多边形API:polylines(img,点集,是否闭环,颜色,……)
img:在哪张图像上画线?
点集:就是多边形上面一个个的点(32位)
是否闭环,True(闭)? 或? False
如果想要填充多边形,不可以将线宽设置为-1,需要使用fillpoly
fillpoly(img,点集,颜色)?
import cv2
import numpy as np
# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)
# 多边形的绘制
pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32) # 必须要写int32
cv2.polylines(img, [pts], True, (0, 0, 255))
# 多边形的填充
cv2.fillPoly(img, [pts], (255, 255, 0))
cv2.imshow('draw', img)
cv2.waitKey(0)
?代码中最需要注意的就是一定是32位的,并且只可以使用int32。
绘制文本API:putText(img,字符串,起始点,字体,字号,……)
import cv2
import numpy as np
# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)
# 绘制文本 1所在位置表示字体 3所在位置表示字号
cv2.putText(img, 'hello world', (10, 300), 1, 3, (0, 255, 0))
cv2.imshow('draw', img)
cv2.waitKey(0)
?
希望实现的基本功能,按住鼠标滑动可以画出我们想要的图案,按键盘不同键绘制出不同的图形。
思考需要的API,首先如果要绘制图形的话,就一定用到上面提到的绘制各种图形的API,并且由于需要鼠标控制,就需要设置鼠标回调函数的知识(在窗口中鼠标控制相关内容-CSDN博客? 可以参考这篇文章关于鼠标回调函数的内容)。
# 基本功能,通过鼠标进行基本图形的绘制
# 1 可以画线 :用户按下l键,即选择了画线。此时滑动鼠标即可画线
# 2 可以画矩形 :当用户按下r,即选择了画矩形。此时滑动鼠标即可画矩形
# 3 可以画圆形 :当用户按下c,即选择了画圆形。此时滑动鼠标即可画圆形
import cv2
import numpy as np
# 设置curshape=0时画线,设置curshape=1时矩形,设置curshape=2时画圆
curshape = 0
startpos = (0, 0)
# 创建窗口
cv2.namedWindow('drawshape', cv2.WINDOW_NORMAL)
# 显示窗口和背景q
img = np.zeros((480, 640, 3), np.uint8) # (高,宽,3)
# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
# print(event,x,y,flags,userdata)
# UnboundLocalError: cannot access local variable 'startpos' where it is not associated with a value
# 解决上述local的问题,把这个两个变为全局变量,如下
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): # drawline
cv2.line(img, startpos, (x, y), (0, 0, 255))
elif (curshape == 1): # drawrectangle
cv2.rectangle(img, startpos, (x, y), (0, 0, 255))
elif (curshape == 2): # drawcircle
a = (x - startpos[0])
b = (y - startpos[1])
r = int((a ** 2 + b ** 2) ** 0.5)
cv2.circle(img, startpos, r, (0, 0, 255))
else:
print('error:no shape')
# 设置鼠标回调
cv2.setMouseCallback('drawshape', mouse_callback)
while True:
cv2.imshow('drawshape', img)
key = cv2.waitKey(30)
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()
?运行结果就是按下不同的键盘按键,会绘制出不同的图片,大家可以自己进行实操。
?
?
?
?