目录
一、环境安装
二、显示窗口
三、创建图片
四、图片保存
五、图像裁剪
六、调整图片大小
七、图像绘制
1、绘制圆形
2、绘制矩形
3、绘制文本
4、绘制直线
5、中文文本
八、控制鼠标
九、鼠标事件
十、视频处理
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
: 窗口大小根据图像大小自动调整,不能手动调整。
完整写法:
# 完整写法
def demo01():# 创建窗口函数,image 窗口名称 cv2.WINDOW.NORMAL 允许手动调整窗口大小cv2.namedWindow("image", cv2.WINDOW_NORMAL)# 设置窗口大小,image 窗口名称,必须和namedWindow的窗口名称一致cv2.resizeWindow("image", 500, 300)# 读取图片,imread 图片路径"""图片路径1、支持绝对和相对路径2、路径中不能使用中文3、图片路径如果有转义字符,用r""表达式进行转义image = cv2.imread(r'images/tar.png')"""image = cv2.imread('images/car.png')# 用窗口显示图片cv2.imshow("image", image)# 等待键盘操作,0:无限等待,waitKey 返回一个ASCII值while True:key = cv2.waitKey(0)if key == 113:print('退出')break# 释放资源(关闭窗口)cv2.destroyAllWindows()
简写:
# 简写
def demo02():# 读取图片,imread 图片路径"""图片路径1、支持绝对和相对路径2、路径中不能使用中文3、图片路径如果有转义字符,用r""表达式进行转义image = cv2.imread(r'images/tar.png')"""image = cv2.imread('images/car.png')print(image)if image is None:print("图片不存在")return# 用窗口显示图片cv2.imshow("image", image)# 等待键盘操作,0:无限等待,waitKey 返回一个ASCII值while True:key = cv2.waitKey(0)if key == 113:print('退出')break# 释放资源(关闭窗口)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 npdef create_picture():# 创建一个图片矩阵# 300 高度, 500 宽度, 3 通道(RGB), 1 灰度图像image = np.zeros((300, 500, 3), dtype=np.uint8)cv2.imshow('image', image)cv2.waitKey(0)cv2.destroyAllWindows()create_picture()
四、图片保存
cv2.imwrite
是 OpenCV 库中的一个函数,用于将图像保存到文件中。这个函数在图像处理和计算机视觉任务中非常常用,特别是在需要将处理后的图像结果保存到磁盘时。
cv2.imwrite(filename, img[, params])
参数
-
filename (str): 要保存的文件路径和名称。支持的文件格式包括
.jpg
,.png
,.bmp
,.tiff
等。 -
img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。
返回值
-
bool: 成功保存图像返回
True
,否则返回False
。
import cv2
import numpy as np# 读取图片
# img = cv2.imread("images/car.png")
img = np.zeros((300, 500, 3), dtype=np.uint8)# 保存图片:imwrite(保存图片路径,图像矩阵),返回布尔值
# iss = cv2.imwrite("save_image/car01.png",img)
iss = cv2.imwrite("save_image/black.png", img)if iss:print("保存成功")
else:print("保存失败")
五、图像裁剪
在 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
的矩形区域。
import cv2img = cv2.imread("images/car.png")# # 获取原图片像素
# h, w, c = img.shape
# print(f'高{h},宽{w},通道{c}')# 定义坐标
x = 100
y = 150
w = 300
h = 100
"""
img[y:y+h, x:x+w] 的含义如下:x: 子区域左上角的 x 坐标。y: 子区域左上角的 y 坐标。w: 子区域的宽度。h: 子区域的高度
"""
car_img = img[y:y+h, x:x+w]
cv2.imshow("old", img)
cv2.imshow("image", car_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
六、调整图片大小
cv2.resize
是 OpenCV 库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。
cv2.resize(src, dsize, dst)
参数
-
src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
-
dsize (tuple): 输出图像的尺寸,是一个二元组
(width, height)
。如果指定了fx
和fy
,则可以忽略此参数。
返回值
-
dst (numpy.ndarray): 缩放后的图像。
作用
- 方便OCR文字识别,像素超过OCR文字的阈值时无法识别,需要调整图片大小。
- 模型训练中,像素大小也会影响模型训练的复杂度。
import cv2"""
调整图片大小作用1、方便OCR文字识别,像素超过OCR文字的阈值时无法识别,需要调整图片大小2、模型训练中,像素大小也会影响模型训练的复杂度
"""# 读取图片
img = cv2.imread("images/car.png")
# print(img.shape) # (276, 754, 3)# 获取图片大小
(h, w) = img.shape[:2]# 调整大小
r_img = cv2.resize(img, (200, 100))
(h, w) = r_img.shape[:2]
print(h, w)cv2.imshow('old', img)
cv2.imshow('new', r_img)cv2.waitKey(0)
cv2.destroyAllWindows()
七、图像绘制
1、绘制圆形
cv2.circle()
函数用于在图像上绘制圆形。
cv2.circle(img, center, radius, color, thickness)
参数
-
img
:要绘制圆形的图像。 -
center
:圆心的坐标。 -
radius
:圆的半径。 -
color
:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)
表示蓝色。 -
thickness
:圆的边界线条的厚度,如果为负值或cv2.FILLED
,表示填充整个圆。
"""
绘制圆形cv2.circle(img, center, radius, color, thickness)- `img`:要绘制圆形的图像。- `center`:圆心的坐标。- `radius`:圆的半径。- `color`:圆的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。- `thickness`:圆的边界线条的厚度,如果为负值或`cv2.FILLED`,表示填充整个圆。
"""
def draw_circle():img = cv2.imread('images/car.png')# 圆心坐标center = (50, 50)# 半径radis = 50# 颜色 (BGR RGB都可以) RGB红色(0,0,255)color = (0, 0, 255)# 线条宽度w = 3# 画圆c_img = cv2.circle(img, center, radis, color, w)cv2.imshow('img', img)cv2.waitKey(0)cv2.destroyAllWindows()
2、绘制矩形
cv2.rectangle()
函数用于在图像上绘制矩形。
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
参数
-
img
:要绘制矩形的图像。 -
pt1
:矩形的一个顶点。 -
pt2
:矩形对角线上的另一个顶点。 -
color
:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)
表示蓝色。 -
thickness
:矩形边框的厚度,如果为负值或cv2.FILLED
,表示填充整个矩形内部。
"""
绘制矩形cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])- `img`:要绘制矩形的图像。- `pt1`:矩形的一个顶点。- `pt2`:矩形对角线上的另一个顶点。- `color`:矩形的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。- `thickness`:矩形边框的厚度,如果为负值或`cv2.FILLED`,表示填充整个矩形内部。
"""
def draw_rectangle():img01 = np.zeros((200, 500, 3), dtype=np.uint8)# 定义绘制矩形的左上角坐标left_top = (100, 100)# 定义绘制矩形的右下角坐标right_bottom = (200, 200)# 定义颜色color = (0, 0, 255)# 定义线条宽度w = 5# 绘制矩形cv2.rectangle(img01, left_top, right_bottom, color, w)cv2.imshow('Rectangle', img01)cv2.waitKey(0)cv2.destroyAllWindows()
3、绘制文本
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
: 抗锯齿线(默认值)
-
4、绘制直线
cv2.line(img, pt1, pt2, color, thickness lineType)
参数
-
img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。
-
pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。
-
pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。
-
color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如
(255, 0, 0)
表示纯蓝色)。对于灰度图像,只需要一个整数值即可。 -
thickness: 可选参数,定义直线的宽度。默认值是 1。
"""
绘制直线
"""
def draw_line():img = cv2.imread('images/car.png')# 直线起始坐标start = (100, 150)# 截止坐标end = (200, 150)# 颜色color = (0, 0, 255)# 宽度w = 10l_img = cv2.line(img, start, end, color, w)cv2.imshow('line', l_img)cv2.waitKey(0)cv2.destroyAllWindows()
5、中文文本
在使用 OpenCV 的 cv2.putText
函数添加中文时,可能会遇到显示乱码的问题。这是因为 OpenCV 默认使用的字体不支持中文字符。为了在图像上正确显示中文,可以使用 PIL(Pillow)库来处理文本,然后将文本渲染到图像上。
- 安装opencv-python和pillow库:
pip install opencv-python pillow
- 下载中文字体文件,常见的中文字体文件有
simhei.ttf
、simsun.ttc
等。 - 定义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
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFontdef 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_textimg = cv2.imread('images/car.png')
# 定义文本内容
text = '你好,世界!'
# 起始坐标 org (x,y)
position = (350, 180)
# 字体格式 fontFace
font_path = 'font/simhei.ttf'
# 字体大小 fontScale
font_size = 30
# 字体颜色 BGR红色 (255,0,0)
color = (255, 0, 0)
# 绘制字体
c_img = put_text(img, text, position, font_path, font_size, color)
cv2.imshow('chinese_text', c_img)cv2.waitKey(0)
cv2.destroyAllWindows()
八、控制鼠标
cv2.setMouseCallback
是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。
import cv2"""
鼠标回调函数event: 鼠标事件x,y: 鼠标在图像区域所在的坐标flag: 标识param: 参数
"""def mouse_callback(event, x, y, flag, param):print(event)print(f'坐标{(x,y)}')print(f'flag={flag}')print(f'param={param}')img = cv2.imread('images/car.png')# 创建对应窗口
cv2.namedWindow('name')
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback('name', mouse_callback)
cv2.imshow('name', img)cv2.waitKey(0)
cv2.destroyAllWindows()
九、鼠标事件
案例:在图片上通过操控鼠标来进行绘制图像
import cv2"""
鼠标回调函数event: 鼠标事件x,y: 鼠标在图像区域所在的坐标flag: 标识param: 参数
"""def mouse_control(event, x, y, flag, param):global d# 鼠标左键按下的事件if event == cv2.EVENT_LBUTTONDOWN:print("鼠标左键按下")cv2.circle(img, (x, y), 50, (0, 255, 0), 2)d = Trueelif event == cv2.EVENT_LBUTTONUP:print("鼠标左键释放")# cv2.circle(img, (x, y), 40, (255, 255, 255), 2)d = Falseelif event == cv2.EVENT_MOUSEMOVE:print("鼠标移动")# d为True时才会触发if d:cv2.circle(img, (x, y), 25, (255, 0, 0), 2)img = cv2.imread('images/car.png')
# 定义窗口
cv2.namedWindow('mouse_control')
d = False
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback('mouse_control', mouse_control)
while True:cv2.imshow('mouse_control', img)# 按下ESC键 关闭程序if cv2.waitKey(20) == 27:break
# 关闭窗口
cv2.destroyAllWindows()
十、视频处理
cv2.VideoCapture
是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。
常用方法
- read()
read()
方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。
- release()
release()
方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。
- isOpened()
isOpened()
方法用于检查视频捕获对象是否已经成功打开。
- get() 和 set()
get()
和 set()
方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。
import cv2# 0:开启摄像头; 参数如果是视频路径则是开启视频
cap = cv2.VideoCapture('video/1.mp4')
# 创建窗口函数,image 窗口名称
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
# 设置窗口大小,image 窗口名称,必须和namedWindow的窗口名称一致
cv2.resizeWindow("video", 500, 300)while True:# 读取视频 ret:是否读取到;frame:图片(帧)ret, frame = cap.read()if ret:cv2.imshow('video', frame)if cv2.waitKey(20) == 27:break
cv2.destroyAllWindows()