OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了丰富的图像处理和计算机视觉算法,广泛应用于各种领域,如图像处理、视频分析、对象检测、人脸识别、机器学习等。
环境安装:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
在已有虚拟环境的情况下,打开命令符输入
进入你指定要安装的目录下,输入上面的下载命令。
1.显示窗口
在进行图片操作时,如果导入图片文件,切记不要把.py文件放在图片文件下。
cv2.namedWindow是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。
格式:
cv2.namedWindow(winname, flags=None)
参数:
winname:通常是字符串类型,用于表示窗口的名称
flags:窗口的标志,用于设置窗口的行为。默认为cv2.WINDOW_AUTOSIZE。即允许调整窗口大小
若设置为cv2.WINDOW_AUTOSIZE: 窗口大小根据图像大小自动调整,不能手动调整。。
设置窗口的大小。
一个窗口显示的基本流程:
(1)读取图片:
函数名为imread,从括号内给定路径读取图片。
(2)创建窗口
(3)显示图像
函数名为imshow;
括号内两个image,一个为窗口名,一个为要显示的图片(前面已经定义过的函数,名字可以自定)
(4)等待按键
括号内的值若为0,即无限期等待,直到有按键时间发生。里面的值为毫秒
也有特殊的值,可以指定为几个特殊的ASCII 值,例如27为Esc键,特定的ASCLL值对应键盘上的键值。
(5)关闭窗口
创建一个空白图像
创建一个黑白图像
RGB 图像可以表示为一个三维矩阵,矩阵的维度为 (height, width, 3)
,其中 height
是图像的高度,width
是图像的宽度,3
表示三个颜色通道。
2.保存图像
``cv2.imwrite` 是 OpenCV 库中的一个函数,用于将图像保存到文件中。这个函数在图像处理和计算机视觉任务中非常常用,特别是在需要将处理后的图像结果保存到磁盘时。
cv2.imwrite(filename, img[, params])
参数说明:
filename:为要保存的路径
img:为要保存的图片
3.图像切片
上图为试例。
先将x,y,w,h定义好,在用公式做裁剪;
x:坐标小于图片的宽度
y:坐标小于图片的高度
w:裁剪后的宽度
h:裁剪后的高度
cai_jian = img[y:y+h,x:w+x]#裁剪图片的标注公式
`img[y:y+h, x:x+w]` 提取的是从 `(x, y)` 开始,宽度为 `w`,高度为 `h` 的矩形区域。
4.改变图片大小
`cv2.resize` 是 OpenCV 库中的一个函数,用于调整图像的大小。
调整图片大小的作用:
1.方便OCR文字识别,像素超过OCR的阈值,识别不出来,需要图片大小调整
2.模型训练师,像素的大小也会影响模型训练的复杂度
cv2.resize(src, dsize, dst)
参数:
src:为要调整的图片名
deside:为调整后的图片大小
获取原图片大小:
用shape方法获取图片的数组,通过切片获得。
5.图像绘制
5.1 绘制圆形
cv2.circle(img, center, radius, color, thickness)
参数解释如下:
img
:要绘制圆形的图像。
center
:圆心的坐标。
radius
:圆的半径。
color
:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)
表示蓝色。
thickness
:圆的边界线条的厚度,如果为负值或cv2.FILLED
,表示填充整个圆。
需要先定义。
5.2 矩形绘制
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
参数:
`img`:要绘制矩形的图像。
`pt1`:矩形的一个顶点。
pt2`:矩形对角线上的另一个顶点。
`color`:矩形的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。
`thickness`:矩形边框的厚度,如果为负值或`cv2.FILLED`,表示填充整个矩形内部。
5.3 绘制文本
cv2.putText 是 OpenCV 库中的一个函数,用于在图像上添加文本。
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
image = cv2.imread("images/car.png")# 定义文本内容和位置
text = "hello world!"
# 文本的左下角位置
position = (50, 200)
# 设置字体类型
font = cv2.FONT_HERSHEY_SIMPLEX
#字体大小
font_scale = 1
#字体颜色
font_color = (0, 255, 0)
#字体线条的粗细
line_type = 2# 在图像上绘制文本
cv2.putText(image, text, position, font, font_scale, font_color, line_type)
# 显示图像
cv2.imshow(' Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存图像(可选)
cv2.imwrite('output_image.png', image)
参数:
-
img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
-
text (str): 要添加的文本字符串。
-
org (tuple): 文本的起始位置,是一个二元组
(x, y)
,表示文本左下角的坐标。 -
fontFace
(int): 字体类型,常见的字体类型包括:
-
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): 添加文本后的图像。
5.4 绘制直线
cv2.line(img, pt1, pt2, color, thickness lineType) -> img
参数:
-
img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。
-
pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。
-
pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。
-
color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如
(255, 0, 0)
表示纯蓝色)。对于灰度图像,只需要一个整数值即可。 -
thickness: 可选参数,定义直线的宽度。默认值是 1。
cv2.line是在原图上操作的。
6.控制鼠标
`cv2.setMouseCallback` 是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。
import cv2
#创建鼠标回调函数
def draw_test(event,x,y,flag,param):print(x,y)
img = cv2.imread('images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
cv2.imshow('image', img)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()
解释:
draw_test函数:
`event`: 鼠标事件类型,如 `cv2.EVENT_LBUTTONDOWN` 表示左键按下。
`x`, `y`: 鼠标事件发生时的坐标。
`flags`: 额外的标志位,通常不用。
`param`: 传递给回调函数的参数,通常不用。
表示鼠标按下:
event == cv2.EVENT_LBUTTONDOWN:
表示鼠标释放:
event ==cv2.EVENT_RBUTTONUP:
表示鼠标在图像上移动:
event ==cv2.EVENT_MOUSEMOVE:
循环操作,知道停止键。
while True:cv2.imshow('name',img)if cv2.waitKey(20) == 27:break
7.视频处理
`cv2.VideoCapture` 是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。
方法:
read()
用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。
release()
用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。
isOpened()
用于检查视频捕获对象是否已经成功打开。
用于检查,返回故障,正常用不着。
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)
cv2.VideoCapture():
标准用法:
解决中文乱码
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