绘制几何形状
使用以下常用参数
- img:要绘制形状的图像
- color:形状的颜色。对于BGR,将其作为元组传递,例如:(255, 0, 0)对应蓝色。对于灰度,只需传递标量值即可。
- 厚度:线或圆等的粗细。若对闭合图形(如圆)传递-1,它将填充形状。默认厚度=1
- lineType:线的类型,默认情况下为8 连接线。
cv.LINE_AA
给出了抗锯齿的线条,看起来非常适合曲线。
画线
绘制一条线,需传递线的开始和结束坐标。
cv.line(img, (0, 0), (30, 40), (255, 0, 0), 3)
绘制一条厚度3的蓝色线
画矩形
绘制矩形,需传递矩形的左上角和右下角
cv.rectangle(img, (30, 40), (80, 70), (255, 255, 0), -1)
以线的末端为矩形左上角绘制一个长为50,宽为30的青色矩形并填充
画圆圈
绘制一个圆,需传递其中心坐标和半径
cv.circle(img, (55, 55), 15, (0, 255, 255), -1)
绘制一个半径为15的黄色圆在矩形内部并填充
画椭圆
绘制椭圆,需传递椭圆的中心位置,轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度;startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。cv.ellipse(img, (256, 256), (100, 50), 0, 0, 360, 255, -1)
在图像的中心绘制一个完整蓝色椭圆形。
画多边形
绘制多边形,需要顶点的坐标。将这些点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,其类型为int32。
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (255, 0, 255))
绘制一个带有4个顶点的紫色小多边形
注意:若cv.polylines()
函数第三个参数为False,将绘制一条连接所有点的折线,而不是闭合形状。cv.polylines()
可用于绘制多条线。只需创建要绘制的所有线条的列表,将其传递给函数即可。
向图像添加文本
文本放入图像中,需指定以下内容。要写入的文字数据、放置的位置坐标(文字数据的左下角)、字体类型(检查cv.putText
获取支持的字体)、字体比例(指定字体大小)、颜色、厚度、线条类型等常规内容。为了更好的外观,建议使用lineType = cv.LINE_AA
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)
在图像中添加OpenCV文本,白色、厚度为2
完整示例
import numpy as np
import cv2 as cv
img = np.zeros((512, 512, 3), np.uint8) #创建黑色的图像
cv.line(img, (0, 0), (30, 40), (255, 0, 0), 3) #绘制一条厚度3的蓝色线
cv.rectangle(img, (30, 40), (80, 70), (255, 255, 0), -1)
cv.circle(img, (55, 55), 15, (0, 255, 255), 3)
cv.ellipse(img,(256, 256),(100, 50), 0, 0, 360, 255, -1)
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (255, 0, 255))
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)
cv.imshow('geometry',img)
if cv.waitKey(0) == ord('q'):
cv.destroyAllWindows
结果如下:
鼠标作为画笔
鼠标可用事件
可使用以下程序代码列出鼠标的可用事件
import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)
使用鼠标回调函数
创建鼠标回调函数具有特定的格式,该格式在所有地方都相同,仅在功能上有所不同,可使用鼠标回调函数实现鼠标相关事情。
在鼠标双击的地方绘制一个蓝色填充的圆圈,按ESC键退出窗口
import cv2 as cv
import numpy as np
#鼠标回调函数(实现在鼠标双击的地方绘制一个蓝色填充的圆圈)
def draw_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), 100, (255, 0, 0), -1)
#创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((5112, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
while(1):
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
通过拖动鼠标来绘制矩形或圆形(取决于选择的模式) ,按r画矩形,按c画圆形
import cv2 as cv
import numpy as np
drawing = False
mode = True
ix, iy = -1, -1
def draw(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True #按下鼠标,则为真
ix, iy = x, y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img, (ix, iy), (x, y), (255, 255, 0), -1)
else:
cv.circle(img, (x, y), 6, (0, 255, 255), -1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img, (ix, iy), (x, y), (255, 255, 0), -1)
else:
cv.circle(img, (x, y), 6, (0, 255, 255), -1)
#创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((5112, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw)
while(1):
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == ord('c'): #按下c键使用另一种模式(画圆)
mode = False
elif cv.waitKey(20) & 0xFF == ord('r'): #按下r键使用第一种模式(画矩形)
mode = True
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
轨迹栏作为调色板
创建一个简单的应用程序,显示指定的颜色。有一个显示颜色的窗口,以及三个用于指定B、G、R颜色的轨迹栏。滑动轨迹栏,可相应地更改窗口颜色。默认情况下,初始颜色将设置为黑色。对于cv.getTrackbarPos()
函数,第一个参数是轨迹栏名称,第二个参数是它附加到的窗口名称,第三个参数是默认值,第四个参数是最大值,第五个是执行的回调函数每次跟踪栏值更改。回调函数始终具有默认参数,即轨迹栏位置。
import cv2 as cv
import numpy as np
def brush_color(x):
pass
#鼠标回调函数(实现在鼠标双击的地方绘制一个圆圈)
def draw_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), 3, color, -1)
#创建一个黑色的图像,一个窗口
img = np.zeros((300, 500, 3), np.uint8)
cv.namedWindow('palette')
cv.imshow('palette', img)
#创建颜色变化的轨迹栏
cv.createTrackbar('R', 'palette', 0, 255, brush_color)
cv.createTrackbar('G', 'palette', 0, 255, brush_color)
cv.createTrackbar('B', 'palette', 0, 255, brush_color)
cv.setMouseCallback('palette', draw_circle)
while(1):
cv.imshow('palette', img)
r = cv.getTrackbarPos('R', 'palette')
g = cv.getTrackbarPos('G', 'palette')
b = cv.getTrackbarPos('B', 'palette')
color = [g, b, r]
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
学习来源:OpenCV中文文档