OpenCV
OpenCV课程
OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。
- OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库
- OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持
- OpenCV可用于开发实时的图像处理,计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用
cv2.namedWindow
是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。
opencv重要性
-
计算机视觉:OpenCV 是计算机视觉领域的标准库之一,广泛应用于图像识别、物体检测、人脸识别、手势识别等。
-
机器人技术:在机器人导航、环境感知和交互中,OpenCV 用于处理传感器数据和视觉信息。
-
医学影像:在医学影像分析中,OpenCV 用于图像增强、分割和特征提取。
-
自动驾驶:在自动驾驶汽车中,OpenCV 用于环境感知、障碍物检测和车道线识别。
-
安全监控:在安全监控系统中,OpenCV 用于运动检测、人脸识别和行为分析。
学习 OpenCV 不仅可以提升你的技术能力,还能为你在计算机视觉和图像处理领域的发展打开更多的门路。无论是学术研究、工业应用还是个人项目,OpenCV 都是一个不可或缺的工具
环境安装
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
显示窗口
cv2.namedWindow
是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时
函数原型
cv2.namedWindow(winname, flags=None)
参数说明
-
winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。
-
flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为
cv2.WINDOW_AUTOSIZE
。常见的标志包括:
cv2.WINDOW_NORMAL
: 允许调整窗口大小。cv2.WINDOW_AUTOSIZE
: 窗口大小根据图像大小自动调整,不能手动调整。。
示例
以下是一个简单的示例,展示如何使用 cv2.namedWindow
创建一个窗口并在其中显示图像:
import cv2
def show_img():
# 创建窗口,窗口名为MyWindow
# 允许调整窗口大小
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# 设置窗口大小
cv2.resizeWindow('image', 640, 480)
# 加载图片
# 图片路径支持相对路径和绝对路径
# 图片路径不能包含中文
# 图片路径包含转义字符,用(r"路径")包含
img = cv2.imread('images/preview.jpg')
if img is None:
print('Image not found')
return
else:
print(img)
# 用窗口显示图片
cv2.imshow('image', img)
# 等待键盘输入,0表示无限期等待
while True:
k = cv2.waitKey()
# key = 27 表示ESC
if k == 27:
break
# cv2.waitKey(0)
# 关闭窗口
cv2.destroyAllWindows()
def show_window():
img = cv2.imread('images/preview.jpg')
if img is None:
print('Image not found')
return
else:
print(img)
cv2.imshow('image', img)
while True:
k = cv2.waitKey()
if k == 27:
break
# 关闭窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
# show_img()
show_window()
详细解释
-
读取图像:
image = cv2.imread('path/to/your/image.jpg')
使用
cv2.imread
函数读取图像文件。 -
创建窗口:
cv2.namedWindow('Image Window', cv2.WINDOW_NORMAL)
使用
cv2.namedWindow
创建一个名为 “Image Window” 的窗口,并设置标志为cv2.WINDOW_NORMAL
,允许用户调整窗口大小。 -
显示图像:
cv2.imshow('Image Window', image)
使用
cv2.imshow
在指定的窗口中显示图像。 -
等待用户按键:
cv2.waitKey(0)
使用
cv2.waitKey
暂停程序执行,等待用户按键。参数0
表示无限期等待,直到有按键事件发生。返回值:是一个ASCII值,
例如:q
键 ASCII 值为 113 ESC 键是27 -
关闭所有窗口:
cv2.destroyAllWindows()
使用
cv2.destroyAllWindows
关闭所有打开的窗口。
其他注意事项
- 窗口名称:窗口名称必须是唯一的,否则会覆盖已有的同名窗口。
- 窗口标志:选择合适的窗口标志可以提升用户体验,特别是在需要用户交互的场景中。
创建空白图像
你可以使用 np.zeros
函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为 (height, width, 3)
)
函数写法
# 创建一个 500x500 像素的空白图像,3 个通道(RGB)
height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)
案例:
import cv2
import numpy as np
def show_bwimg():
# 创建图片矩阵,300高x500宽,3 通道
img = np.zeros((300, 500, 3), dtype=np.uint8)
print(img)
cv2.imshow("iamge", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
show_bwimg()
保存图片
``cv2.imwrite` 是 OpenCV 库中的一个函数,用于将图像保存到文件中。这个函数在图像处理和计算机视觉任务中非常常用,特别是在需要将处理后的图像结果保存到磁盘时。
函数原型
cv2.imwrite(filename, img[, params])
参数说明
- filename (str): 要保存的文件路径和名称。支持的文件格式包括
.jpg
,.png
,.bmp
,.tiff
等。 - img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。
返回值
- bool: 成功保存图像返回
True
,否则返回False
。
示例
以下是一个简单的示例,展示如何使用 cv2.imwrite
将图像保存到文件中:
import cv2
# 读取图片
img = cv2.imread('images/preview.jpg')
# 保存图片
iss = cv2.imwrite('save_images/preview_save.jpg', img)
if iss:
print('保存成功')
else:
print('保存失败')
其他注意事项
- 文件路径:确保提供的文件路径是有效的,如果路径不存在,OpenCV 会尝试创建它,但如果权限不足则会保存失败。
图像切片(裁剪)
在 OpenCV 中,图像切片用于从图像中提取一个子区域(矩形区域)。这种操作在图像处理中非常常见,特别是在进行目标检测、ROI(Region of Interest,感兴趣区域)提取等任务时。
语法解释
假设你有一个图像 img
,它的类型是 numpy.ndarray
。img[y:y+h, x:x+w]
的含义如下:
- x: 子区域左上角的 x 坐标。
- y: 子区域左上角的 y 坐标。
- w: 子区域的宽度。
- h: 子区域的高度。
切片操作
img[y:y+h, x:x+w]
提取的是从(x, y)
开始,宽度为w
,高度为h
的矩形区域。
示例
假设你有一个图像 img
,并且你想要从这个图像中提取一个特定的矩形区域,
import cv2
def mouse_callback(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print(f"鼠标左键点击: ({x}, {y})")
img = cv2.imread('images/car.png')
if img is None:
print("图像加载失败,请检查路径是否正确")
else:
h, w, c = img.shape
print(f"高度:{h}, 宽度:{w}, 通道:{c}")
# 定义坐标轴
x, y = 330, 170
h, w = 55, 160
# 裁剪图片
cut_img = img[y:y + h, x:x + w]
ch, cw, cc = cut_img.shape
print(f"裁剪后高度:{ch}, 宽度:{cw}, 通道:{cc}")
cv2.imshow('img', img)
cv2.imshow('cut_img', cut_img)
cv2.setMouseCallback("img", mouse_callback)
cv2.waitKey(0)
cv2.destroyAllWindows()
其他注意事项
- 边界检查:确保
(x, y)
和(x+w, y+h)
都在图像的边界内,否则会导致数组索引越界错误。 - 数据类型:
img
通常是numpy.ndarray
类型,切片操作返回的也是numpy.ndarray
类型。
调整图片大小
cv2.resize
是 OpenCV 库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。
函数原型
cv2.resize(src, dsize, dst)
参数说明
- src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
- dsize (tuple): 输出图像的尺寸,是一个二元组
(width, height)
。如果指定了fx
和fy
,则可以忽略此参数。
返回值
- dst (numpy.ndarray): 缩放后的图像。
示例
以下是一个简单的示例,展示如何使用 cv2.resize
调整图像的大小:
import cv2
# 读取图片
img = cv2.imread('images/preview.jpg')
# 获取图片大小
(h, w) = img.shape[:2]
print(f"图片高度:{h},宽度:{w}")
# 缩放图片
r_img = cv2.resize(img, (300,200))
(rh, rw) = r_img.shape[:2]
print(f"缩放后图片高度:{rh},宽度:{rw}")
cv2.imshow('r_img', r_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像绘制
绘制圆形
cv2.circle()
函数用于在图像上绘制圆形。该函数的语法如下:
cv2.circle(img, center, radius, color, thickness)
其中,参数解释如下:
-
img
:要绘制圆形的图像。 -
center
:圆心的坐标。 -
radius
:圆的半径。 -
color
:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)
表示蓝色。 -
thickness
:圆的边界线条的厚度,如果为负值或cv2.FILLED
,表示填充整个圆。案例
import cv2
from PyQt5.QtCore import center
# 绘制图像
img = cv2.imread('images/car.png')
# 定制参数,圆心坐标
center = (50, 50)
# 半径
radius = 50
# 颜色
color = (0, 0, 255)
# 粗细
w = 1
# 绘制圆
c_circle = cv2.circle(img, center, radius, color, w)
cv2.imshow('img', img)
while True:
k = cv2.waitKey()
if k == 27:
break
cv2.destroyAllWindows()
绘制矩形
cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下:
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
其中,参数解释如下:
img
:要绘制矩形的图像。pt1
:矩形的一个顶点。pt2
:矩形对角线上的另一个顶点。color
:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)
表示蓝色。thickness
:矩形边框的厚度,如果为负值或cv2.FILLED
,表示填充整个矩形内部。
import cv2
import numpy as np
img = np.zeros((200, 300, 3),dtype=np.uint8)
# 定义矩形左上角坐标
left_top = (50, 50)
# 定义矩形右下角坐标
right_bottom = (150,250)
# 定义颜色
color = (255, 255, 255)
# 定义线条粗细
thickness = 5
# 画矩形
r_rectangle = cv2.rectangle(img, left_top, right_bottom, color, thickness)
cv2.imshow('rectangle',r_rectangle)
while True:
k = cv2.waitKey()
if k == 27:
break
cv2.destroyAllWindows()
绘制文本
cv2.putText
是 OpenCV 库中的一个函数,用于在图像上添加文本。这个函数在图像处理和计算机视觉任务中非常有用,特别是在需要标注图像、显示信息或调试时。
函数原型
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
参数说明
-
img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
-
text (str): 要添加的文本字符串。
-
org (tuple): 文本的起始位置,是一个二元组
(x, y)
,表示文本左下角的坐标。 -
fontFace
(int): 字体类型,常见的字体类型包括:
cv2.FONT_HERSHEY_SIMPLEX
: 正常大小的无衬线字体cv2.FONT_HERSHEY_PLAIN
: 小号的无衬线字体cv2.FONT_HERSHEY_DUPLEX
: 正常大小的无衬线字体,比FONT_HERSHEY_SIMPLEX
更粗cv2.FONT_HERSHEY_COMPLEX
: 正常大小的有衬线字体cv2.FONT_HERSHEY_TRIPLEX
: 正常大小的有衬线字体,比FONT_HERSHEY_COMPLEX
更粗cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
: 手写风格的字体cv2.FONT_HERSHEY_SCRIPT_COMPLEX
: 手写风格的字体,比FONT_HERSHEY_SCRIPT_SIMPLEX
更粗cv2.FONT_ITALIC
: 斜体修饰符,可以与其他字体类型组合使用
-
fontScale (float): 字体大小的比例因子。
-
color (tuple): 文本颜色,是一个三元组
(B, G, R)
,表示蓝色、绿色和红色的值。 -
thickness (int, 可选): 文本线条的厚度,默认值为 1。
-
lineType
(int, 可选): 线条类型,常见的线条类型包括:
cv2.LINE_4
: 4 连通线cv2.LINE_8
: 8 连通线cv2.LINE_AA
: 抗锯齿线(默认值)
返回值
- img (numpy.ndarray): 添加文本后的图像。
示例
以下是一个简单的示例,展示如何使用 cv2.putText
在图像上添加文本:
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def put_text(image, text, org, font_path, font_size, color):
# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(pil_image)
# 加载字体
font = ImageFont.truetype(font_path, font_size)
# 绘制文本
draw.text(org, text, fill=color, font=font)
# 将 PIL 图像转换回 OpenCV 图像
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image_with_text
# 读取图像
img = cv2.imread('images/preview.jpg')
# 定义字体文本内容
# text = "hello OpenCV"
text = "金诚"
# 定义起始坐标
org = (50, 50)
# 定义字体路径
# font = cv2.FONT_HERSHEY_SIMPLEX
font_path = 'fontFace/simhei.ttf'
# 定义字体大小
font_size = 40
# 定义字体颜色
color = (0, 0, 255) # BGR 格式
# 绘制文字
# c_text = cv2.putText(img, text=text, org=org, fontFace=font, fontScale=size, color=color, thickness=thickness)
c_img = put_text(img, text, org, font_path, font_size, color)
# 显示图像
cv2.imshow('Image with Text', c_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制直线
cv2.line(img, pt1, pt2, color, thickness lineType) -> img
参数说明
-
img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。
-
pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。
-
pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。
-
color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如
(255, 0, 0)
表示纯蓝色)。对于灰度图像,只需要一个整数值即可。 -
thickness: 可选参数,定义直线的宽度。默认值是 1。
返回值
- img: 返回的是经过修改后的图像,实际上就是传入的图像本身,因为
cv2.line()
是直接在原图上操作的。
cv2.line()
是 OpenCV 库中的一个函数,用于在图像上绘制直线。这个函数非常直观,它接受多个参数来定义直线的位置、颜色、厚度等属性。以下是 cv2.line()
函数的基本语法及其参数说明
import cv2
img = cv2.imread('images/preview.jpg')
# 设置直线起点坐标
start = (100,150)
# 设置直线终点坐标
end = (300,400)
# 设置直线颜色
color = (255,0,0)
# 设置直线粗细
thickness = 5
l_line = cv2.line(img, start, end, color, thickness)
cv2.imshow('line',l_line)
while True:
k = cv2.waitKey()
if k == 27:
break
cv2.destroyAllWindows()
控制鼠标
cv2.setMouseCallback
是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。
案例:
import cv2
# 鼠标回调函数
"""
event: 鼠标事件
x, y: 鼠标坐标
flags: 鼠标标识
param: 鼠标状态
"""
d = False
def mouse_callback(event, x, y, flags, param):
global d
# print(event)
# print(f"坐标{(x, y)}")
# print(f"标识{flags}")
# print(f"状态{param}")
# 鼠标左键按下
if event == cv2.EVENT_LBUTTONDOWN:
print(f"鼠标左键按下: ({x}, {y})")
# cv2.circle(img, (x, y), 25, (0, 0, 255),thickness=5)
d = True
elif event == cv2.EVENT_LBUTTONUP:
print(f"鼠标左键抬起: ({x}, {y})")
d = False
elif event == cv2.EVENT_MOUSEMOVE:
print(f"鼠标移动: ({x}, {y})")
if d:
cv2.circle(img, (x, y), 25, (0, 0, 255), thickness=5)
# 按下鼠标右键将图片保存到目录save_images中
elif event == cv2.EVENT_RBUTTONDOWN:
iss = cv2.imwrite('save_images/preview_save01.jpg', img)
if iss:
print('保存成功')
else:
print('保存失败')
img = cv2.imread('images/preview.jpg')
def cv_save():
# 定义窗口
cv2.namedWindow('image')
# 设置鼠标操作的回调函数
cv2.setMouseCallback('image', mouse_callback)
while True:
cv2.imshow('image', img)
if cv2.waitKey(20) == 27:
break
elif cv2.waitKey(20) == ord('q'):
iss = cv2.imwrite('save_images/preview_save01.jpg', img)
if iss:
print('保存成功')
else:
print('保存失败')
cv2.destroyAllWindows()
if __name__ == '__main__':
cv_save()
代码解释
- draw_test函数:
event
: 鼠标事件类型,如cv2.EVENT_LBUTTONDOWN
表示左键按下。x
,y
: 鼠标事件发生时的坐标。flags
: 额外的标志位,通常不用。param
: 传递给回调函数的参数,通常不用。
cv2.setMouseCallback('image', draw_test)
设置鼠标回调函数,当在 ‘image’ 窗口中发生鼠标事件时,调用 draw_circle
函数
案例:在图像上绘制圆形
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def put_text(image, text, count, org, font_path, font_size, color):
# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(pil_image)
# 加载字体
font = ImageFont.truetype(font_path, font_size)
# 计算“火箭走起来”的宽度
text_width = draw.textlength(text, font=font)
# 绘制“火箭走起来”
draw.text(org, text, fill=color, font=font)
# 绘制 count 值
count_text = f" {count}"
count_org = (org[0] + text_width, org[1])
draw.text(count_org, count_text, fill=color, font=font)
# 将 PIL 图像转换回 OpenCV 图像
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image_with_text
count = 0
def mouse_callback(event, x, y, flags, param):
global count
if event == cv2.EVENT_LBUTTONDOWN:
print(f"鼠标左键按下: ({x}, {y})")
count += 1
print(count)
def work():
# 读取视频
cap = cv2.VideoCapture("video/1.mp4")
# 定义字体文本内容
text = "把赞点起来"
# 定义起始坐标
org = (550, 50)
# 定义字体路径
font_path = 'fontFace/simhei.ttf'
# 定义字体大小
font_size = 40
# 定义字体颜色
color = (255, 0, 0) # BGR 格式
while True:
ret, frame = cap.read()
if not ret:
break
# 在当前帧上绘制文字
frame_with_text = put_text(frame, text, count, org, font_path, font_size, color)
# 显示带有文字的帧
cv2.imshow("video", frame_with_text)
# 鼠标回调函数
cv2.setMouseCallback('video', mouse_callback)
if cv2.waitKey(10) == 27: # 按下 ESC 键退出
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
work()
当鼠标按下,屏幕上的点赞数值会+1,长按左键会绘制圆形,按下鼠标右键,会将图片保存到save_image目录,按下键盘也能达到相同效果。
视频处理
cv2.VideoCapture
是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。
常用方法
read()
read()
方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。
ret, frame = cap.read()
if not ret:
print("Failed to grab frame")
break
release()
release()
方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。
cap.release()
isOpened()
isOpened()
方法用于检查视频捕获对象是否已经成功打开。
if not cap.isOpened():
print("Error opening video stream or file")
get()
和set()
get()
和 set()
方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。
# 获取帧宽
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# 获取帧高
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 获取帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置帧宽
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# 设置帧高
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
案例
import cv2
# 打开视频文件或摄像头
# 使用 0 打开默认摄像头,或者替换为视频文件路径,例如 'video.mp4'
video_capture = cv2.VideoCapture('video/1.mp4') # 0 表示使用摄像头
if not video_capture.isOpened():
print("视频没有打开")
exit()
# 获取视频的帧率
fps = video_capture.get(cv2.CAP_PROP_FPS)
delay = int(1000 / fps) # 计算帧间延迟
while True:
# 逐帧读取视频
ret, frame = video_capture.read()
# 显示当前帧
cv2.imshow('Video', frame)
# 按下 'q' 键退出
if cv2.waitKey(delay) & 0xFF == ord('q'):
break
# 释放视频捕获对象和关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()
关于opencv 显示中文乱码问题解决
在使用 OpenCV 的 cv2.putText
函数添加中文时,可能会遇到显示乱码的问题。这是因为 OpenCV 默认使用的字体不支持中文字符。为了在图像上正确显示中文,可以使用 PIL(Pillow)库来处理文本,然后将文本渲染到图像上
1 确保你已经安装了 opencv-python
和 Pillow
库。如果没有安装,可以通过 pip 安装:
注意:如果用的Anaconda ,是包含了这个库,可以不安装
pip install opencv-python pillow
2 下载一个中文字体文件,常见的中文字体文件有 simhei.ttf
、simsun.ttc
等。你可以从系统中找到这些字体文件,或者从互联网下载。
3 定义 put_text 函数
def put_text(image, text, position, font_path, font_size, color):
# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(pil_image)
# 加载字体
font = ImageFont.truetype(font_path, font_size)
# 在图像上绘制文本
draw.text(position, text, fill=color, font=font)
# 将 PIL 图像转换回 OpenCV 图像
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image_with_text
4 案例
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
def put_text(image, text, position, font_path, font_size, color):
# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(pil_image)
# 加载字体
font = ImageFont.truetype(font_path, font_size)
# 在图像上绘制文本
draw.text(position, text, fill=color, font=font)
# 将 PIL 图像转换回 OpenCV 图像
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image_with_text
# 读取图像
image = cv2.imread('images/car.png')
# 定义文本内容、位置、字体路径、字体大小和颜色
text = "你好,世界!"
position = (50, 50)
font_path = "myfont/simhei.ttf" # 替换为你的字体文件路径
font_size = 30
color = (0, 0, 255) # BGR 格式
# 在图像上添加中文文本
image_with_text = put_text(image, text, position, font_path, font_size, color)
# 显示图像
cv2.imshow('Image with Text', image_with_text)
cv2.waitKey(0)
cv2.destroyAllWindows()
原文地址:https://blog.csdn.net/qq_70019265/article/details/143405171
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!