\qquad cv2.imshow()函数在显示图像时,指定的窗口如果不存在,则会按默认设置创建一个窗口,窗口大小由图像大小决定,且不能更改。cv2.namedWindow()函数用于创建窗口,其基本格式如下。
cv2.namedWindow(winname[,flags])
其中,winname 为窗口名称,flags 为表示窗口属性的常量。如果已存在指定名称的窗口,函数将无效。常用的窗口属性常量如下:
属性 | 解释 |
---|---|
cv2.WINDOW_NORMAL | 用户可以调整窗口大小,无限制 |
cv2.WINDOW_AUTOSIZE | 默认值,用户无法调整窗口大小,窗口大小由显示的图像决定 |
cv2.WINDOW_FULLSCREEN | 窗口将全屏显示 |
cv2.WINDOW_GUI_EXPANDED | 窗口中可显示状态栏和工具栏 |
cv2.WINDOW _FREERATIO | 窗口将尽可能多地显示图片(无比例限制) |
cv2.WINDOW_KEEPRATIO | 窗口由图像的比例决定 |
import numpy
import cv2
img = numpy.zeros((240, 320), dtype=numpy.uint8) # 创建黑色图像
img[70:170, 110:210] = 255 # 设置白色区域
cv2.namedWindow('test3-1', cv2.WINDOW_NORMAL) # 创建普通窗口
cv2.imshow('test3-1', img) # 在窗口中显示图像
cv2.waitKey(0)
\qquad OpenCV 提供了以下两个用于关闭窗口的函数。分别是cv2.destroyAllWindows(),cv2.destroyWindow (winname)。其中cv2.destroyAllWindows()是关闭所有窗口,而cv2.destroyWindow (winname)是关闭指定名称的窗口。
cv2在调整窗口大小上提供了cv2.resizeWindow()函数来更改窗口大小,其基本格式如下。
cv2.resizeWindow(winname,size)
其中,winname 为窗口名称,size 为表示窗口大小的二元组。
import cv2
img = cv2.imread('lena.jpg') # 读取图像
s = img.shape
cv2.imshow('lena', img) # 显示图像
key = cv2.waitKey(500)
cv2.resizeWindow('lena', (s[0]//2, s[1]//2))
cv2.waitKey(0)
\qquad OpenCV提供的绘图函数可用于绘制直线,矩形,圆,椭圆,多边形以及文本等。
cv2提供了cv2.line()函数用于绘制直线,其语法格式如下:
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
其参数说明如下:
参数 | 解释 |
---|---|
img | 为用于绘制图像的图像 |
pt1 | 为直线段的起点坐标 |
pt2 | 为直线段的终点坐标 |
color | 为直线段的颜色。通常使用 BGR 模型表示颜色,如(255,0,0)表示蓝色 |
thickness | 表示线条粗细。默认值为 1,设置为-1时表示绘制填充图形 |
lineType | 表示线条类型,默认值为 cv2.Line_8。线条类型可设置为以下常量:cv2.FILLED:填充;cv2.LINE_4:4 条连接线;cv2.LINE_8:8条连接线;cv2.LINE_AA:抗锯齿线,线条更平滑。 |
shift | 表示坐标的数值精度,一般情况下不需要设置 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8) # 创建一幅黑色图像
cv2.line(img, (0, 0), (320, 200), (0, 0, 255), 10) # 画对角线1,红色
cv2.line(img, (320, 0), (0, 200), (0, 255, 0), 5) # 画对角线2,绿色
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
cv2.rectangle()函数用于绘制矩形,其语法格式如下:
cv2.rectangle(img,ptl,pt2,color[,thickness[,linetype[,shift]]])
其参数说明如下:
参数 | 解释 |
---|---|
ing,color, thickness,lineType 和 shift等参数 | 与 cv2.ine()函数中的含义一致 |
pt1 | 为矩形的一个顶点 |
pt2 | 为矩形中与 pt1相对的另一个顶点 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8) # 创建一幅黑色图像
cv2.rectangle(img, (20, 20), (300, 180), (255, 0, 0), 10) # 画矩形,蓝色边框
cv2.rectangle(img, (70, 70), (250, 130), (0, 255, 0), 2) # 画矩形,绿色填充
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
cv2.circle()函数用于绘制圆,其语法格式如下:
cv2.circle(img,center,radius,color[,thickness[,linetype[,shift]]])
其参数说明如下:
参数 | 解释 |
---|---|
ing,color, thickness,lineType 和 shift等参数 | 与 cv2.ine()函数中的含义一致 |
center | 为圆心坐标 |
radius | 为圆的半径 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8) # 创建一幅黑色图像
cv2.circle(img, (160, 100), 80, (255, 0, 0), 5) # 画圆,蓝色边框
cv2.circle(img, (160, 100), 40, (0, 255, 0), -1) # 画圆,绿色填充
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
cv2.ellipse()函数用于绘制椭圆,其语法格式如下:
cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType[, shift]]])
其参数说明如下:
参数 | 解释 |
---|---|
img、color、thickness、lineType 和 shift等参数 | 与 cv2.line()函数中的含义一致 |
center | 为椭圆圆心坐标 |
axes | 为椭圆的轴。例如,(100,50)表示长轴的一半为 100,短轴的一半为 50 |
angle | 为椭圆长轴的旋转角度,即长轴与 x轴的夹角 |
startAngle | 为圆弧的开始角度 |
endAngle | 为圆弧的结束角度。开始角度为 0°,结束角度为 360°时,可绘制完整椭圆,否则为椭圆弧 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8)+255 # 创建一幅白色图像
cv2.ellipse(img, (160, 100), (120, 50), 0, 0, 360, (255, 0, 0), 5) # 画椭圆,蓝色边框
cv2.ellipse(img, (160, 100), (60, 15), 0, 0, 360, (0, 255, 0), 51) # 画椭圆,绿色填充
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
cv2.polylines()函数用于绘制多边形,其语法格式如下:
cv2.polylines(img, pts, isClosed, color[,thickness[,lineType[, shift]]])
其参数说明如下:
参数 | 解释 |
---|---|
ing,color, thickness,lineType 和 shift等参数 | 与 cv2.ine()函数中的含义一致 |
pts | 为多边形各顶点坐标 |
isClosed | 为True时,绘制封闭多边形;否则依次连接各顶点,绘制一条曲线 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8)+255 # 创建一幅白色图像
pts = np.array([[160, 20], [20, 100], [160, 180], [300, 100]], np.int32) # 创建顶点
cv2.polylines(img, [pts], True, (255, 0, 0), 5) # 画多边形,蓝色边框
pts = np.array([[160, 60], [60, 100], [160, 140], [260, 100]], np.int32) # 创建顶点
cv2.polylines(img, [pts], False, (0, 255, 0), 1) # 画曲线,绿色边框
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
cv2.putText()函数用于绘制文本,其语法格式如下:
cv2.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[,bottomLeftOrigin]]])
其参数说明如下:
参数 | 解释 |
---|---|
ing,color, thickness,lineType 和 shift等参数 | 与 cv2.ine()函数中的含义一致 |
text | 为要绘制的文本 |
org | 为文本左下角的位置 |
fontFace | 为字体类型,参数值可设置为如下常量 |
cv2.FONT_HERSHEY_SIMPLEX | 正常大小的 sans-serif 字体 |
cv2.FONT_HERSHEY_PLAIN | 小号的 sans-serif 字体 |
cv2.FONT_HERSHEY_DUPLEX | 较复杂的正常大小的 sans-serif 字体 |
cv2.FONT_HERSHEY_COMPLEX | 正常大小的 serif 字体 |
cv2.FONT_HERSHEY_TRIPLEX | 较复杂的正常大小的 serif 字体 |
cv2.FONT_HERSHEY_COMPLEX_SMALL | 简化版正常大小的 serif 字体 |
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX | 手写风格字体 |
cv2.FONT_HERSHEY_SCRIPT_COMPLEX | 较复杂的手写风格字体 |
cv2.FONT_ITALIC | 斜体 |
fontScale | 为字体大小 |
bottomLeftOrigin | 为文本方向,默认值为False;设置为True时,文本为垂直镜像效果 |
cv2.putText()函数不能在图像中绘制中文,但可以使用PIL模块在图像中绘制中文。
首先我们需要安装PIL模块,在cmd命令窗口输出:
pip install Pillow
来安装PIL模块,这里可能会有点小疑惑,为什么不是直接pip install PIL而是Pillow,其实因为没有名为PIL的模块,而出于向后兼容的原因,Pillow仍使用PIL作为其模块名称。所以直接pip install PIL会报错。
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8)+255 # 创建一幅白色图像
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.putText(img, 'hello', (50, 60), font, 2, (255, 0, 0), 2, cv2.LINE_AA) # 绘制文字
cv2.putText(img, 'Python', (50, 100), font, 2, (255, 0, 0), 2, cv2.LINE_AA, True) # 绘制镜像文字
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
from PIL import ImageFont, ImageDraw, Image
import numpy as np
import cv2
img = np.zeros((200,320,3), np.uint8)+255 # 创建一幅白色图像
fontpath = "STSONG.TTF" # 指定字体文件名
font1 = ImageFont.truetype(fontpath, 36) # 载入字体,设置字号
img_pil = Image.fromarray(img) # 转换为PIL支持格式
draw = ImageDraw.Draw(img_pil) # 创建Draw对象
draw.text((50, 60), '你好,世界', font=font1, fill=(0, 0, 0)) # 绘制文字
img = np.array(img_pil) # 转换为图像数组
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
cv2.arrowedLine()函数用于绘制箭头,其语法格式如下:
cv2.arrowedLine(img, pt1, pt2, color[, thickness[, lineType[,shift[, tipLength]]]])
其参数说明如下:
参数 | 解释 |
---|---|
ing,,pt1,pt2,color, thickness,lineType 和 shift等参数 | 与 cv2.ine()函数中的含义一致 |
tipLength | 为箭尖相对于箭头的比例,默认为0.1 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8)+255 # 创建一幅白色图像
cv2.arrowedLine(img, (50, 50), (50, 150), (0, 0, 255), 2) # 绘制红色垂直箭头
cv2.arrowedLine(img, (50, 50), (300, 50), (0, 0, 255), 2) # 绘制红色水平箭头
cv2.imshow('draw', img) # 显示图像
cv2.waitKey(0)
OpenCV 可在用户触发鼠标事件时,调用鼠标回调函数完成事件处理。
鼠标回调函数的基本格式如下。
def mouseCallback(event,X,y,flags,param):...
其参数说明如下:
参数 | 说明 |
---|---|
mouseCallback | 为自定义函数名称 |
event | 为调用时传递给函数的鼠标事件对象 |
x和y | 为触发鼠标事件时,鼠标指针在窗口中的坐标(x,y) |
flags | 为触发鼠标事件时,鼠标拖动或键盘按键操作,参数可设置为下列常量 |
cv2.EVENT_LBUTTONDBLCLK | 双击鼠标左键 |
cv2.EVENT_LBUTTONDOWN | 按下鼠标左键 |
cv2.EVENT_LBUTTONUP | 释放鼠标左键 |
cv2.EVENT_MBUTTONDBLCLK | 双击鼠标中键 |
cv2.EVENT_MBUTTONDOWN | 按下鼠标中键 |
cv2.EVENT_MOUSEHWHEEL | 滚动鼠标中键(正、负值表示向左或向右滚动) |
cv2.EVENT_MBUTTONUP | 释放鼠标中键 |
cv2.EVENT_MOUSEWHEEL | 滚动鼠标中键(正、负值表示向前或向后滚动) |
cv2.EVENT_MOUSEMOVE | 鼠标移动 |
cv2.EVENT_RBUTTONDBLCLK | 双击鼠标右键 |
cv2.EVENT_RBUTTONDOWN | 按下鼠标右键 |
cv2.EVENT_RBUTTONUP | 释放鼠标右键 |
cv2.EVENT_FLAG_ALTKEY | 按下【Alt】键 |
cv2.EVENT_FLAG_CTRLKEY | 按下【Ctrl】键 |
cv2.EVENT_FLAG_LBUTTON | 按住鼠标左键拖动 |
cv2.EVENT_FLAG_MBUTTON | 按住鼠标中键拖动 |
cv2.EVENT_FLAG_RBUTTON | 按住鼠标右键拖动 |
cv2.EVENT_FLAG_SHIFTKEY | 按下【Shift】键 |
param | 为传递给回调函数的其他数据 |
cv2.setMouseCallback()用于为图像窗口绑定鼠标回调函数,其基本格式如下:
cv2.setMousecallback(wname, mouseCallback)
其参数说明如下:
参数 | 说明 |
---|---|
wname | 为图像窗口的名称 |
mouseCallback | 为鼠标回调函数名称 |
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8)+255 # 创建一幅白色图像
def draw(event, x, y, flag, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x, y), 20, (255, 0, 0), -1) # 双击鼠标左键时画圆
elif event == cv2.EVENT_RBUTTONDBLCLK:
cv2.rectangle(img, (x, y), (x+20, y+20), (0, 0, 255), -1) # 双击鼠标右键时画矩形
cv2.namedWindow('drawing')
cv2.setMouseCallback('drawing', draw)
while(True):
cv2.imshow('drawing', img) # 显示图像
k = cv2.waitKey(1)
if k == 27: # 按【Esc】键时结束循环
break
cv2.destroyAllWindows()
跟踪栏(Trackbar)是 OpenCV 为图像窗口提供的交互工具。用户可以通过跟踪栏中的滑块位置获取特定范围内的值。
cv2.createTrackbar()函数用于创建跟踪栏,其基本格式如下:
cv2,createTrackbar(trackbarname,wname,value,count,onChange,userdata)
其参数说明如下:
参数 | 说明 |
---|---|
trackbarname | 为跟踪栏的名称 |
wname | 为图像窗口的名称 |
value | 为跟踪栏中滑块的初始位置 |
count | 为跟踪栏的最大值,最小值为 0. |
onChange | 为跟踪栏滑块位置变化时调用的回调函数名称 |
userdata | 为传递给回调函数的其他可选数据 |
cv2.getTrackbarPos()函数用于返回跟踪栏的当前值,其基本格式如下:
retval=cv2.getTrackbarPos(trackbarname, wname)
其参数说明如下:
参数 | 说明 |
---|---|
i trackbarname | 为跟踪栏的名称 |
wname | 为图像窗口的名称 |
import numpy as np
import cv2
img = np.zeros((120, 400, 3), np.uint8) # 创建一幅黑色图像
def doChange(x):
b = cv2.getTrackbarPos('B', 'trakbar')
g = cv2.getTrackbarPos('G', 'trakbar')
r = cv2.getTrackbarPos('R', 'trakbar')
img[:] = [b, g, r] # 更改图像
cv2.namedWindow('trakbar')
cv2.createTrackbar('B', 'trakbar', 0, 255, doChange) # 创建跟踪栏
cv2.createTrackbar('G', 'trakbar', 0, 255, doChange)
cv2.createTrackbar('R', 'trakbar', 0, 255, doChange)
while(True):
cv2.imshow('trakbar', img) # 显示图像
k = cv2.waitKey(1)
if k == 27: # 按【Esc】键时结束循环
break
cv2.destroyAllWindows()
绘制一幅图像,在图像中单击鼠标左键时绘制鼠标指针所在的点和坐标,单价鼠标右键时使用前面单击鼠标左键的点绘制多边形。
import numpy as np
import cv2
img = np.zeros((320, 640, 3), np.uint8)+255 # 创建一幅白色图像
font = cv2.FONT_HERSHEY_PLAIN
xys = []
def draw(event, x, y, flag, param): # 定义鼠标回调函数
global xys
if event == cv2.EVENT_LBUTTONUP: # 响应释放鼠标左键事件
xy = '(%s,%s)' % (x, y)
cv2.putText(img, xy, (x, y), font, 2, (0, 0, 0), 1, cv2.LINE_AA) # 绘制左标
xys.append([x, y]) # 记录鼠标位置
cv2.circle(img, (x, y), 5, (0, 0, 255), -1) # 画圆,标注鼠标位置
elif event == cv2.EVENT_RBUTTONUP: # 响应释放鼠标右键事件
pts = np.array(xys, np.int32) # 创建顶点
cv2.polylines(img, [pts], True, (255, 0, 0), 2) # 画多边形,蓝色边框
xys = []
cv2.imshow('drawing', img) # 显示图像
cv2.namedWindow('drawing') # 命名图像窗口
cv2.setMouseCallback('drawing', draw) # 为窗口绑定回调函数
cv2.imshow('drawing', img) # 显示图像
cv2.waitKey(0)