版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
O
p
e
n
C
V
计算机视觉基础主讲教师:***OpenCV:Open
Source
Computer
Vision
LibraryPython版慕课版第1章本章主要内容:Open
CV简介配置开发环境使用Open
CV文档和示例实验1.1
O
p
e
n
C
V简介本节主要内容:Open
CV主要功能及模块介绍Open
CV的版本Open
CV-
Python1.1.1
O
p
e
n
C
V主要功能及模块介绍1、内置数据结构和输入/输出
Open
CV内置了丰富的与图像处理有关的数据结构,如Image、Point、Rectangle等。core模块实现了各种基本的数据结构。imgcodecs模块提供了图像文件的读写功能,用户使用简单的命令即可读写图像文件。
2、图像处理操作imgproc模块提供了图像处理操作,如图像过滤、几何图像变换、绘图、色彩空间转换、直方图等。3、图形用户界面操作。highgui模块提供了图像的图形窗口操作功能,如创建窗口显示图像或者视频、令窗口响应键盘和鼠标事件、操作窗口中图像的某个区域等。1.1.1
O
p
e
n
C
V主要功能及模块介绍4、视频分析。video模块提供了视频分析功能,如分析视频中连续帧之间的运动、跟踪视频中的目标。
videostab模块提供了视频稳定处理功能,可解决拍摄视频时的抖动问题。optflow模块提供了与光流操作相关的算法。5、3
D重建。calib
3
d模块提供了3
D重建功能,可根据2
D图像创建3
D场景。6、特征提取。features
2
d模块提供了特征提取功能,可以从2
D图像中检测和提取对象的特征。1.1.1
O
p
e
n
C
V主要功能及模块介绍7、对象检测。objdetect和xobjdetect模块提供了对象检测功能,可在图像中检测给定图像的位置。8、机器学习。ml模块提供了机器学习功能,包含了多种机器学习算法,如k近邻(k-NearestNeighbors,k
NN)、k均值聚类(k-Means
Clustering)、支持向量机(SupportVector
Machines,SVM)、神经网络(Neural
Network)等。机器学习算法广泛应用于目标识别、图像分类、人脸检测、视觉搜索等。9、深度学习。深度神经网络(Deep
Neural
Network,DNN)模块提供了深度学习功能。深度学习
是机器学习中近几年来快速发展的一个子领域,广泛应用于语音识别、图像识别、自然语言处理、图像修复、人脸识别等。Open
CV的深度学习支持Caffe、Tensor
Flow、Torch、Darknet等著名的深度学习框架。1.1.1
O
p
e
n
C
V主要功能及模块介绍10、计算摄影。计算摄影通过图像处理技术来改善相机拍摄的图像,如高动态范围成像、全景图像、图像补光等。photo和xphoto模块提供了与计算摄影有关的算法,stitching模块提供了全景图像算法。11、形态分析。shape模块提供了形态分析功能,可以识别图像中对象的形状、分析形状之间的相似性、转换对象形状等。12、人脸检测和识别。Open
CV已在face模块中实现了人脸检测、人脸特征检测和人脸识别功能。人脸检测属于对象检测,用于找出图像中人脸的位置和尺寸。人脸特征检测属于特征检测,用于找出图像中人脸的主要特征。人脸识别属于对象识别,包括从已知人脸集合中找出与未知人脸最匹配的人脸,以及验证给定人脸是否为某个已知人脸。Open
CV实现了基于Haar级联分类器和基于深度学习的人脸检测算法,以及Eigen
Faces、Fisher
Faces和局部二进制编码直方图(
Local
Binary
Patterns
Histograms,LBPH)等人脸识别算法。1.1.1
O
p
e
n
C
V主要功能及模块介绍13、表面匹配。surface_matching模块提供了3
D对象识别算法和3
D特征的姿态估计算法,用于根据图像的深度和强度信息识别3
D对象。14、文本检测和识别。text模块提供了文本检测和识别功能,用于识别和检测图像中的文本,实现车牌识别、道路标志识别、内容数字化等相关应用。1.1.2
O
p
e
n
C
V的版本1999年Intel创建
OpenCV项目2009年10月2006年10月OpenCV
1.0OpenCV
2.02015年6月OpenCV
3.02018年11月2020年10月2021年4月OpenCV
4.5.2OpenCV
4.5.0OpenCV
4.01.1.2
O
p
e
n
C
V的版本1999年,加里·布拉德斯基在Intel公司创建了计算机视觉库(
Computer
Vision
Library,CVL)项目,项目旨在提供通用的计算机视觉接口,接口用C++语言实现,以开源方式发布。2006年10月,Open
CV
1.0版本正式发布。Open
CV
1.0的主要更新包括:在Windows安装软件包中添加了预编译的Python模块;增加了Borland
C++(
v
5.6+)生成文件;增加了图像修复功能;添加了增强的树分类器;在highgui模块中增加了对JPEG
2000和EXR的支持;增加了PNG、JPEG
2000和Open
EXR的8位图像输入/输出;更新了CMUcamera包装器。1.1.2
O
p
e
n
C
V的版本2009年9月,Open
CV
2.0版本发布。Open
CV
2.0的主要更新包括:修复了Windows安装包;将Min
GW用于预编译的二进制文件;增加了新的Python接口。2015年6月,Open
CV
3.0版本发布。Open
CV
3.x版本不再向后兼容Open
CV
2.x版本。Open
CV
3.0的主要更新包括:修复了包括文档、生成脚本、Python包装器、core、imgproc、photo、features
2
d、objdetect、contrib等模块的200多处错误;为cv::parallel_for_()函数添加了并行后端处理功能,使所有并行处理都能得到兼容操作系统的支持;用Java重写了Android上的Open
CV管理器,使其可同时支持Open
CV
2.4和3.0版本。1.1.2
O
p
e
n
C
V的版本2018年,Open
CV
4.0版本发布。Open
CV
4.0的主要更新包括:其已成为C++11库,兼容C++11的编译器;删除了1.x版本中的许多C函数;核心模块中与XML、YAML、JSON相关的数据结构已在C++中全部实现;在DNN中增加了对Mask-RCNN模型的支持、集成了ONNX解析器、部分支持YOLO对象检测、提升了对Intel的DLDT的支持性能;增加了全新的opencv_gapi(
G-API)模块。1.1.2
O
p
e
n
C
V的版本2020年10月,Open
CV
4.5.0版本发布该版本的主要更新内容如下。Open
CV许可证已更改为Apache
2:从Open
CV
4.5.0开始,所有未来的Open
CV
4.x和Open
CV
5.x版本都将根据Apache
2许可进行分发,Open
CV
3.x将继续使用BSD许可。GSo
C
2020已经结束,大多数成果已合并到Open
CV,并且在Open
CV
4.5.0中可用。用Open
JPEG替换分布式Windows软件包中的Jasper。添加了对Open
CL多个上下文的支持。更新了DNN和G-API模块的部分内容。2021年4月,Open
CV
4.5.2版本发布Open
CV
3.X版本也在持续支持更新1
.
1
.
3
O
p
e
n
C
V
-
P
y
t
h
o
nOpen
CV-Python是由原始Open
CV
C++实现的Python包装器,是Open
CV库的Python接口。Python是吉多·范罗苏姆(
Guido
van
Rossum)创建的一种面向对象的、解释型的计算机高级程序设计语言。Python因具有语法简洁、易于学习、功能强大、可扩展性强、跨平台等诸多特点,成为继Java和C语言之后的又一热门程序设计语言。与C/C++相比,Python速度较慢。用户通过Open
CV-Python可获得两大好处:首先,代码运行速度与原始C/C++代码一样快(因为它在后台运行的是实际C++代码);其次,用Python编写代码更容易。Open
CV-Python需要使用Num
Py库,Open
CV在程序中使用
Num
Py数组存储图像数据。1.2配置开发环境本节主要内容:安装Python安装Num
Py安装Open
CV-Python安装Visual
Studio1.2.1安装P
y
t
h
o
n从Python官网下载安装Python1.2.2安装N
u
m
P
y执行pip
install
numpy命令,安装Num
Py包1.2.3安装O
p
e
n
C
V-P
y
t
h
o
n安装Open
CV-Python有3种方式:pip安装方式、安装官方预编译包方式和源代码安装方式。1、pip安装方式在PYPI中查看Open
CV-Python包信息安装Open
CV-Python包2、安装官方预编译包方式3、源代码安装方式1.2.4安装V
i
s
u
a
l
S
t
u
d
i
o
C
o
d
eVisual
Studio
Code(简称“VS
Code”)是微软公司提供的一个免费的集成开发工具,它具有支持智能感知、运行、调试、内置Git、可扩展等诸多特点。VS
Code可作为Java、Javascript、C#、
Python、Ruby等众多语言的开发工具。在Windows中安装VS
Code。1.3使用O
p
e
n
C
V文档和示例本节主要内容:查看Open
CV文档查看Open
CV-Python示例1.3.1查看O
p
e
n
C
V文档在Open
CV官网查看文档1.3.2查看O
p
e
n
C
V-P
y
t
h
o
n示例Open
CV官方在线文档的“Examples”页面中列出了示例的C++代码目录1.3.2查看O
p
e
n
C
V-P
y
t
h
o
n示例要获得Open
CV-Python示例代码,可访问Open
CV发布页面,下载Open
CV的源代码。源代码的“samples\python”文件夹中包含了Open
CV-Python的示例代码。1.4实验本节主要内容:实验1:配置虚拟开发环境实验2:在VS
Code中运行示例1.4.1实验1:配置虚拟开发环境1.实验目的掌握Python+Open
CV应用开发虚拟环境的配置方法。
2.实验内容创建Python虚拟环境。在虚拟环境中安装Num
Py和Open
CV-Python包。移动虚拟环境文件夹的位置,测试虚拟环境能否正常使用。
3.实验过程1.4.2实验2:在V
S
C
o
d
e中运行示例1.实验目的掌握使用VS
Code运行Open
CV示例的方法。
2.实验内容在VS
Code中运行Open
CV示例中的边缘检测示例edge.py。3.实验过程课程结束谢谢观看O
p
e
n
C
V
计算机视觉基础Python版慕课版主讲教师:***第2章图像处理基础本章主要内容:Num
Py简介图像基础操作图像运算实验2.1
N
u
m
P
y简介本节主要内容:数据类型创建数组数组形状索引、切片和迭代数组运算2.1.1数据类型Num
Py比Python支持更多的数据类型,如表2-1所示。数据类型说明np.bool_布尔值(True或False),存储为字节np.byte由平台定义np.ubyte由平台定义np.short由平台定义np.ushort由平台定义c由平台定义np.uintc由平台定义_由平台定义np.uint由平台定义np.longlong由平台定义np.ulonglong由平台定义np.halfnp.float16半精度浮点数:1位符号、5位指数、10位尾数np.single平台定义的单精度浮点数:通常为1位符号、8位指数、23位尾数np.double平台定义的双精度浮点数:通常为1位符号、11位指数、52位尾数np.longdoublenp.csinglenp.cdouble平台定义的扩展精度浮点数复数,由两个单精度浮点数(实部和虚部)表示复数,由两个双精度浮点数(实部和虚部)表示np.clongdouble复数,由两个扩展精度浮点数(实部和虚部)表示Num
Py还提供了一组表示固定大小的数据类型别名,如表2-2所示。数据类型别名说明8带符号的8位整数(-128~127)16带符号的16位整数(-32
768~32
767)32带符号的32位整数(-231~231-1)64带符号的64位整数(-263~263-1)np.uint8无符号的8位整数(0~255)np.uint16无符号的16位整数(0~65
535)np.uint32无符号的32位整数(0~232-1)np.uint64无符号的64位整数(0~264-1)p用于索引的整数np.uintp足够大以容纳指针的整数np.float3232位单精度浮点数np.float64、np.float_与Python的float类型的精度匹配plex64复数,由两个32位浮点数(实部和虚部)表示plex128、plex_与Python的complex类型的精度匹配在Python中使用Num
Py数据类型的示例代码如下。>>>import
numpy
as
np
#导入Num
Py包,np是按惯例使用的名称,也可为其他名称>>>a=np.int
8(123)
#定义一个整数>>>type(a)
#查看其数据类型<class
'
numpy.
int
8
'
>2.1.2创建数组1.使用a
r
r
a
y()函数创建数组N
u
m
P
y的a
r
r
a
y()函数可将P
y
t
h
o
n中类似数组的数据结构(如列表和元组)转换为数组,示例代码如下。>>a=n
p.a
r
r
a
y([1,2,3])
#将列表转换为数组>>p
r
i
n
t(a)
#输出数组[
1
2
3
]>>t
y
p
e(a)
#查看数组的数据类型<
c
l
a
s
s
'
n
u
m
p
y
.
n
d
a
r
r
a
y
'
>>>a=n
p.a
r
r
a
y((1,2,3))
#将元组转换为数组>>a=n
p.a
r
r
a
y(([1,2,3],[4,5,6]))
#将嵌套数据转换为数组>>p
r
i
n
t(a)
#输出数组[
[
1
2
3
][
4
5
6
]
]>
>
>
a
=
n
p
.
a
r
r
a
y
(
(
[
1
,
2
,
3
]
,
[
4
,
5
]
)
)#将不规则的数据转换为数组>
>
p
r
i
n
t
(
a
)[
l
i
s
t
(
[
1
,
2
,
3
]
)
l
i
s
t
(
[
4
,
5
]
)
]注意,在将嵌套的多维数据转换为数组时,同维度数据的个数应该相同;否则,N
u
m
P
y会将其作为一个P
y
t
h
o
n对象放入数组。2.使用z
e
r
o
s()函数创建数组创建指定形状的数组,数组元素默认值为0,数据类型默认为f
l
o
a
t,函数参数用于指定数组的形状,示例代码如下。>>n
p.z
e
r
o
s((2,3))
#创建2行3列的二维数组
a
r
r
a
y([[0.,0.,0.],[
0
.
,
0
.
,
0
.
]
]
)>
>
n
p
.
z
e
r
o
s
(
(
2
,
5
)
,
d
t
y
p
e
=
i
n
t
)#用d
t
y
p
e参数指定数组元素的数据类型a
r
r
a
y
(
[
[
0
,
0
,
0
,
0
,
0
]
,[
0
,
0
,
0
,
0
,
0
]
]
)>
>
n
p
.
z
e
r
o
s
(
(
2
,
3
,
4
)
)#创建三维数组a
r
r
a
y
(
[
[
[
0
.
,
0
.
,
0
.
,
0
.
]
,[
0
.
,
0
.
,
0
.
,
0
.
]
,[
0
.
,
0
.
,
0
.
,
0
.
]
]
,[
[
0
.
,
0
.
,
0
.
,
0
.
]
,[
0
.
,
0
.
,
0
.
,
0
.
]
,[
0
.
,
0
.
,
0
.
,
0
.
]
]
]
)3.使用arange()函数创建数组创建元素值按规则递增的数组,类似于Python的range()函数,示例代码如下。>>>np.arange(5)
#元素取值范围为[0,4]
array([0,1,2,3,4])>>>np.arange(-2,5)
#元素取值范围为[-1,4]
array([-2,-1,0,1,2,3,4])>>>np.arange(5.6)
#数组元素的数据类型默认与参数一致
array([0.,1.,2.,3.,4.,5.])>>>np.arange(-2,2,dtype=float)#用dtype参数指定数组元素的数据类型
array([-2.,-1.,0.,1.])4.使用linspace(a,b,c)函数创建数组创建由参数c指定元素数量的数组,其第一个元素为a,最后一个元素为b,相邻元素的差值为(b-a)/(c-1),示例代码如下。>>>
np.
linspace(
1
,
5
,
6
)array([
1
.
,
1
.
8
,
2
.
6
,
3
.
4
,
4
.
2
,
5
.
])5.使用indices()函数创建数组创建一个有两个元素的一维数组,每个元素都是一个指定形状的数组,其元素值表示该维的变化,示例代码如下。>>>np.indices((3,4))
#数组元素是一个大小为3×4的数组
array([[[0,0,0,0],[
1
,
1
,
1
,
1
],[
2
,
2
,
2
,
2
]],[[
0
,
1
,
2
,
3
],[
0
,
1
,
2
,
3
],[
0
,
1
,
2
,
3
]]])6.使用ones()函数创建数组ones()函数用于创建元素值为1的数组(单位矩阵),示例代码如下。>>>
np.
ones((
5
,),
dtype=int)array([
1
,
1
,
1
,
1
,
1
])>>>
np.
ones((
5
,))array([
1
.,
1
.,
1
.,
1
.,
1
.])>>>
np.
ones((
2
,
5
))array([[
1
.,
1
.,
1
.,
1
.,
1
.],[
1
.,
1
.,
1
.,
1
.,
1
.]])>>>
np.
ones((
2
,
5
),
dtype=int)array([[
1
,
1
,
1
,
1
,
1
],[
1
,
1
,
1
,
1
,
1
]])#创建一维数组,元素值为整数1#创建一维数组,元素值为浮点数1.0#创建大小为2×5的二维数组2.1.3数组的形状数组对象的shape属性可用于查看或改变数组的形状,示例代码如下。>>>a=np.arange(12)
#创建一维数组,其中共有12个元素>>>
aarray([
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
])>>>a.shape
#查看数组形状
(12,)>>>
a.
shape=(
2
,-
1
)#更改数组形状为2行,-1表示每行中的元素个数自动计算>>>
aarray([[
0
,
1
,
2
,
3
,
4
,
5
],[
6
,
7
,
8
,
9
,
10
,
11
]])reshape()方法可更改数组形状,并返回更改后的新数组,示例代码如下。>>>
a.
reshape((
3
,-
1
))#更改数组形状,返回新数组array([[
0
,
1
,
2
,
3
],[
4
,
5
,
6
,
7
],[
8
,
9
,
10
,
11
]])>>>
a.
reshape((
2
,
3
))#reshape()方法不能减少或增加数组元素个数Traceback
(
most
recent
call
last):File
"
<stdin>",
line
1
,
in
<module>Value
Error:
cannot
reshape
array
of
size
12
into
shape
(
2
,
3
)resize()方法的refcheck参数为False时,可在改变形状的同时更改元素个数,示例代码如下。>>>a.resize((3,4))
#更改形状>>>
aarray([[
0
,
1
,
2
,
3
],[
4
,
5
,
6
,
7
],[
8
,
9
,
10
,
11
]])>>>
a.
resize((
2
,
3
),
refcheck=False)#更改形状并减少元素个数>>>
aarray([[
0
,
1
,
2
],[
3
,
4
,
5
]])>>>
a.
resize((
2
,
5
),
refcheck=False)#增加元素个数>>>
aarray([[
0
,
1
,
2
,
3
,
4
],[
5
,
0
,
0
,
0
,
0
]])np.ravel()函数可将数组转换为一维数组,示例代码如下。>>>
a=np.
arange(
12
)>>>
a.
resize((
3
,
4
))>>>
aarray([[
0
,
1
,
2
,
3
],[
4
,
5
,
6
,
7
],[
8
,
9
,
10
,
11
]])>>>
np.
ravel(
a)array([
0
,
1
,
2
,
3
,
4
,
5
,
6
,>>>
np.
ravel(
a,
order='
F')#返回一维数组,默认行优先7
,
8
,
9
,
10
,
11
])#返回一维数组,列优先array([
0
,
4
,
8
,
1
,
5
,
9
,
2
,
6
,
10
,
3
,
7
,
11
])2.1.4索引、切片和迭代—维数组的索引、切片和迭代等操作与P
y
t
h
o
n的列表类似,示例代码如下。>>r
n
g=n
p.r
a
n
d
o
m.d
e
f
a
u
l
t
_
r
n
g()#获得随机数生成器>
>
a
=
r
n
g
.
i
n
t
e
g
e
r
s
(
1
0
,
s
i
z
e
=
8
)>
>
aa
r
r
a
y
(
[
6
,
1
,
4
,
6
,
0
,
0
,
1
,
0
]
,
d
t
y
p
e
=
i
n
t
6
4
)>>a[0]
#索引:第1个元素>>a[-1]
#索引:最后1个元素>>a[2]
#索引:第3个元素>>a[2:5]
#切片a
r
r
a
y
(
[
4
,
6
,
0
]
,
d
t
y
p
e
=
i
n
t
6
4
)>
>
a
[
:
2
]a
r
r
a
y
(
[
6
,
1
]
,
d
t
y
p
e
=
i
n
t
6
4
)>
>
a
[
5
:
]a
r
r
a
y
(
[
0
,
1
,
0
]
,
d
t
y
p
e
=
i
n
t
6
4
)>
>
f
o
r
x
i
n
a
:#迭代.
.
.
p
r
i
n
t
(
x
,
e
n
d
=
'
'
)多维数组用以逗号分隔的多个值进行索引,示例代码如下。>>>
rng
=
np.
random.
default_rng()>>>a=rng.integers(10,size=(2,5))#创建一个大小为2×5的数组,元素为10以内的随机整数>>>
aarray([[
6
,
8
,
9
,
5
,
7
],[
8
,
3
,
1
,
2
,
1
]],
dtype=int
64
)>>>
a[
0
,
0
]#索引:第1行第1个元素6>>>
a[
1
,
0
]#索引:第2行第1个元素8>>>
a[
0
,:
3
]#切片:第1行前3个元素array([
6
,
8
,
9
],
dtype=int
64
)>>>
for
x
in
a:...
print(
x)#迭代2.1.5数组运算N
u
m
P
y数组与常量执行算术运算和比较运算时,会对每个数组元素执行计算,示例代码如下。>
>
a
=
n
p
.
a
r
a
n
g
e
(
5
)>
>
aa
r
r
a
y
(
[
0
,
1
,
2
,
3
,
4
]
)>
>
a
+
5#每个元素加上5a
r
r
a
y
(
[
5
,
6
,
7
,
8
,
9
]
)>
>
a
-
5#每个元素减去5a
r
r
a
y
(
[
-
5
,
-
4
,
-
3
,
-
2
,
-
1
]
)>
>
a
*
5#每个元素乘以5a
r
r
a
y
(
[
0
,
5
,
1
0
,
1
5
,
2
0
]
)>
>
a
*
*
2#每个元素求平方a
r
r
a
y
(
[
0
,
1
,
4
,
9
,
1
6
]
,
d
t
y
p
e
=
i
n
t
3
2
)>
>
a
/
2#每个元素除以2,结果为浮点数a
r
r
a
y
(
[
0
.
,
0
.
5
,
1
.
,
1
.
5
,
2
.
]
)>
>
a
/
/
2#每个元素除以2,结果为整数a
r
r
a
y
(
[
0
,
0
,
1
,
1
,
2
]
,
d
t
y
p
e
=
i
n
t
3
2
)>
>
>
a
<
2
.
5#每个元素执行比较运算a
r
r
a
y
(
[
T
r
u
e
,
T
r
u
e
,
T
r
u
e
,
F
a
l
s
e
,
F
a
l
s
e
]
)两个数组执行算术运算时,“*”运算符用来计算元素乘积,“@”运算符和d
o
t()方法用来计算矩阵乘积,示例代码如下。>
>
>
a
=
n
p
.
a
r
r
a
y
(
[
[
1
,
2
]
,
[
3
,
4
]
]
)>
>
>
b
=
n
p
.
a
r
r
a
y
(
[
[
1
0
,
0
]
,
[
0
,
1
0
]
]
)>
>
a
+
b#矩阵加法>
>
b
-
a#矩阵减法>
>
a
@
b#矩阵乘法>
>
a
.
d
o
t
(
b
)#矩阵乘法>
>
>
a
=
n
p
.
a
r
r
a
y
(
[
[
1
,
2
,
3
]
,
[
4
,
5
,
6
]
]
)>
>
a
.
T#矩阵转置a
r
r
a
y
(
[
[
1
,
4
]
,[
2
,
5
]
,[
3
,
6
]
]
)Num
Py数组支持“+=”“*=”等赋值运算,且会用计算结果覆盖原数组,示例代码如下。>>>
a+=
10>>>
aarray([[
11
,
12
,
13
],[
14
,
15
,
16
]])>>>
a*
=
2>>>
aarray([[
22
,
24
,
26
],[
28
,
30
,
32
]])Num
Py为数组提供了一些执行计算的方法,示例代码如下。>>>
a=np.
array([[
1
,
2
,
3
],[
4
,
5
,
6
]])>>>a.min()
#求最小元素值1>>>a.max()
#求最大元素值6>>>a.sum()
#求所有元素和
21可设置axis参数以便按指定的轴执行计算,示例代码如下。>>>
a.
max(
axis=
0
)#返回最大值所在的行array([
4
,
5
,
6
])>>>
a.
max(
axis=
1
)#返回每一行中的最大值array([
3
,
6
])>>>
a.
sum(
axis=
0
)#按列执行加法array([
5
,
7
,
9
])>>>
a.
sum(
axis=
1
)#按行执行加法array([
6
,
15
])2.2图像基础操作本节主要内容:读、写、显示图像读、写、播放视频操作灰度图像操作彩色图像图像通道操作2.2.1读、写、显示图像1.读取图像Open
CV的imread()函数用于将文件中的图像读入内存,imread()函数支持各种静态图像文件格式,如
BMP、PNG、JPEG和TIFF等,示例代码如下。#test
2-1.py:读取图像
import
cv
2img=cv
2
.
imread('
lena.
jpg')#读取图像print(
type(
img))#输出数据类型print(
img)#输出图像数组print(
img.
shape)#输出数组形状print(
img.
dtype)#输出数组元素的数据类型print(
img.
size)#输出数组元素的个数img.shape的输出结果为(512,512,3),说明表示彩色图像的数组是一个三维数组,3个值依次表示图像的高度、宽度和通道数;图像的分辨率为512×512。代码中img.dtypes的输出结果为uint
8,说明每个数组元素用一个字节(
8位)保存,每个数组元素为一个像素的B、G和R通道的颜色值,颜色值取值范围为[0,255]。代码中img.size的输出结果为786432,等于数组形状的3个维度大小的乘积,即512×512×3。imread()函数的完整格式如下。img=cv
2
.
imread(
filename,
flag)其中,filename为图像文件名,flag为图像读取格式标志,如表2-3所示。imread()函数在正确读取图像文件时,返回表示图像的Num
Py数组;否则返回NULL。表2-3图像读取格式标志图像读取格式标志说明cv2.IMREAD_UNCHANGED按原样加载图像cv2.IMREAD_GRAYSCALE将图像转换为单通道灰度图像cv2.IMREAD_COLOR将图像转换为3通道BGR彩色图像cv2.IMREAD_ANYDEPTH当图像具有相应的深度时,返回16位或32位图像,否则将其深度转换为8位cv2.IMREAD_ANYCOLOR以任何可能的颜色格式读取图像cv2.IMREAD_LOAD_GDAL使用gdal驱动程序加载图像cv2.IMREAD_REDUCED_GRAYSCALE_2将图像转换为单通道灰度图像,并且图像尺寸减小为1/2cv2.IMREAD_REDUCED_COLOR_2将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/2cv2.IMREAD_REDUCED_GRAYSCALE_4将图像转换为单通道灰度图像,并且图像尺寸减小为1/4cv2.IMREAD_REDUCED_COLOR_4将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/4cv2.IMREAD_REDUCED_GRAYSCALE_8将图像转换为单通道灰度图像,并且图像尺寸减小为1/8cv2.IMREAD_REDUCED_COLOR_8将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/8cv2.IMREAD_IGNORE_ORIENTATION不根据EXIF方向标志旋转图像示例代码如下。import
cv
2
img=cv
2.imread('lena.jpg',cv
2.IMREAD_REDUCED_GRAYSCALE_
4)#读取图像
print(img.shape)print(
img.
size)2.写图像Open
CV的imwrite()函数用于将Num
Py数组中保存的图像写入文件,示例代码如下。
#test
2-2.py:将图像存入文件import
cv
2import
numpyimg=numpy.
zeros((
50
,
50
),
dtype=numpy.
uint
8
)#创建大小为50×50的黑色正方形图像cv
2
.
imwrite('
mypic
2
-
1
.
jpg',
img)#将图像存入文件3.显示图像Open
CV的imshow()函数用于在窗口中显示图像,示例代码如下。
#test
2-3.py:显示图像import
cv
2img=cv
2
.
imread('
lena.
jpg',
cv
2
.
IMREAD_REDUCED_COLOR_
2
)#读取图像并将图像尺寸减小1/2cv
2
.
imshow('
lena',
img)#显示图像imshow()函数的第1个参数为窗口名称,第2个参数为图像数组wait
Key()函数等待用户输入,该函数的基本格式如下。
rv=cv
2.wait
Key([delay])其中:rv保存函数返回值,如果没有键被按下,返回-1;如果有键被按下,返回键的ASCII码。参数delay表示等待按键的时间(单位为毫秒),负数或0表示无限等待,默认值为0;设置了delay参数时,等待时间结束时结束等待,函数返回-1。示例代码如下。#test
2-4.py:等待按键
import
cv
2img=cv
2.imread('lena.jpg',cv
2.IMREAD_REDUCED_COLOR_
2)
cv
2.imshow('lena',img)
#显示图像#读取图像,缩小为原来的1/2key=
0while
key!
=
27
:#按Esc键时终止循环key=cv
2
.
wait
Key()#等待按键cv
2
.
destroy
Window('
lena')#关闭图像窗口2.2.2读、写、播放视频Open
CV的Video
Capture类和Video
Writer类提供了视频处理功能,支持各种格式的视频文件。视频处理的基本操作步骤如下。将视频文件或者摄像头作为数据源来创建Video
Capture对象。调用Video
Capture对象的read()方法获取视频中的帧,每一帧都是一幅图像。调用Video
Writer对象的write()方法将帧写入视频文件,或者调用cv
2.imshow()函数在窗口中显示帧(即播放视频)。1.播放视频Open
CV播放视频的实质是逐帧读取和显示帧图像,示例代码如下。#test
2-5.py:播放视频
import
cv
2vc=cv
2
.
Video
Capture('
test
2
-
5
.
mp
4
')fps=vc.
get(
cv
2
.
CAP_PROP_FPS)#创建Video
Capture对象
#读取视频帧速率size=(
vc.
get(
cv
2
.
CAP_PROP_FRAME_HEIGHT),#读取视频大小vc.get(cv
2.CAP_PROP_FRAME_WIDTH))print('帧速率:',fps)print('大小:',size)#读第1帧#循环读视频帧,直到视频结束
#在窗口中显示帧图像#读下一帧#延迟时间
#按【Esc】键退出success,
frame=vc.
read()while
success:cv
2
.
imshow('
myvideo',
frame)success,
frame=vc.
read()key=cv
2
.
wait
Key(
25
)if
key==
27
:breakvc.
release()#关闭视频2.将视频写入文件将视频写入文件与播放视频类似,需要逐帧将视频写入文件,示例代码如下。#test
2-6.py:将视频写入文件
import
cv
2vc=cv
2
.
Video
Capture('
test
2
-
5
.
mp
4
')
fps=vc.
get(
cv
2
.
CAP_PROP_FPS)
size=(
int(
vc.
get(
cv
2
.
CAP_PROP_FRAME_WIDTH)),int(
vc.
get(
cv
2
.
CAP_PROP_FRAME_HEIGHT)))vw=cv
2
.
Video
Writer('
test
2
-
6
out.
avi',#创建Video
Capture对象
#读取视频帧速率#读取视频大小#设置保存视频的文件名cv
2
.
Video
Writer_fourcc('
X','
V','
I','
D'),#设置视频解码器格式fps,
size)success,
frame=vc.
read()while
success:vw.
write(
frame)success,
frame=vc.
read()vc.
release()#设置帧速率和大小
#读第1帧#循环读视频帧,直到视频结束
#将帧写入文件#读下一帧
#关闭视频常用的解码器格式如下。cv
2.Video
Writer_fourcc('P','I','M','1'):XVID的MPEG-1编码格式,视频文件扩展名为.avi。cv
2.Video
Writer_fourcc('M','P','4','2'):Microsoft的MPEG-4编码格式,视频文件扩展名为.avi。cv
2.Video
Writer_fourcc('X','V','I','D'):XVID的MPEG-4编码格式,视频文件扩展名为.avi。cv
2.Video
Writer_fourcc('F','L','V','1'):XVID的MPEG-4编码格式,视频文件扩展名为.flv。3.捕获摄像头视频要捕获摄像头视频,需要将摄像头ID作为参数来创建Video
Capture对象。通常,0表示默认摄像头,示例代码如下。#test
2-7.py:将摄像头视频写入文件
import
cv
2vc=cv
2
.
Video
Capture(
0
)fps=
30#创建Video
Capture对象,视频源为默认摄像头
#预设视频帧速率size=(int(vc.get(cv
2.CAP_PROP_FRAME_WIDTH)),
int(vc.get(cv
2.CAP_PROP_FRAME_HEIGHT)))#读取视频大小
vw=cv
2.Video
Writer('test
2-
7
out.avi',cv
2.Video
Writer_fourcc('X','V','I','D'),fps,size)#设置帧#读第1帧#循环读视频帧,直到视频结束
#将帧写入文件#显示帧success,
frame=vc.
read()while
success:vw.
write(
frame)
cv
2
.
imshow('
My
Camera',
frame)key=cv
2
.
wait
Key()if
key==
27
:breaksuccess,
frame=vc.
read()vc.
release()#按【Esc】键结束#读下一帧
#关闭视频2.2.3操作灰度图像计算机将灰度处理为2
5
6级(
0
~
2
5
5
),0表示黑色,2
5
5表示白色,用一个字节来存储一个像素的值。O
p
e
n
C
V使用单通道的二维数组来表示灰度图像,示例代码如下。#t
e
s
t
2-8.p
y:操作灰度图像
i
m
p
o
r
t
c
v
2i
m
p
o
r
t
n
u
m
p
yi
m
g
=
n
u
m
p
y
.
z
e
r
o
s
(
(
2
4
0
,
3
2
0
)
,
d
t
y
p
e
=
n
u
m
p
y
.
u
i
n
t
8
)#创建2
4
0×3
2
0黑色图像n
=
0w
h
i
l
e
T
r
u
e
:
c
v
2
.
i
m
s
h
o
w
(
'
G
r
a
y
I
m
g
'
,
i
m
g
)n
+
=
2
0i
m
g
[
:
,
:
]
=
n#更改图像灰度值p
r
i
n
t
(
i
m
g
[
1
,
1
]
)#输出一个像素值k
e
y
=
c
v
2
.
w
a
i
t
K
e
y
(
1
0
0
0
)#延迟1秒i
f
k
e
y
=
=
2
7
:b
r
e
a
k#按【E
s
c】键结束2.2.4操作彩色图像不同色彩空间中,颜色的表示方法有所不同,但不同色彩空间之间可根据公式进行转换。本小节简单介绍RGB色彩空间中图像的表示方法。RGB中的R指红色(
Red),G指绿色(
Green),B指蓝色(
Blue)。在表示图像时,有R、G和B
3个通道,分别对应红色、绿色和蓝色。每个通道中像素的取值范围为[0,255],用3个通道的像素组合表示彩色图像。RGB色彩空间中颜色通道依次为R、G、B,但Open
CV默认的图像格式为BGR,即颜色通道依次为B、G、R。#test
2-9.py:操作彩色图像#创建一幅彩色图像,图像的上、中、下3个部分依次为蓝色、绿色和红色
#程序每隔1秒轮换3个部分的颜色import
cv
2import
numpy#创建图像img=numpy.
zeros((
240
,
320
,
3
),
dtype=numpy.
uint
8
)r
0
=
0r
1
=
1r
2
=
2while
True:#通道r
0,将上部1/3颜色值设为255#通道r
1,将中部1/3颜色值设为255#通道r
2,将下部1/3颜色值设为255img[:
80
,:,
r
0
]
=
255img[
80
:
160
,:,
r
1
]
=
255img[
160
:,:,
r
2
]
=
255cv
2
.
imshow('
Color
Img',
img)key=cv
2
.
wait
Key(
1000
)img[:,:,:]
=
0t=r
0r
0
=r
1r
1
=r
2r
2
=tif
key==
27
:break#延迟1秒#像素全部置0#轮换通道序号#按【Esc】键结束2.2.5图像通道操作1.通过数组索引拆分通道Open
CV中BGR格式的图像是一个三维数组,可用数组的索引操作拆分3个色彩通道,示例代码如下。
#test
2-10.py:通过数组索引拆分通道import
cv
2img=cv
2
.
imread('
lena.
jpg',
cv
2
.
IMREAD_REDUCED_COLOR_
2
)1
/
2cv
2
.
imshow('
lena',
img) #
显示原图像b=img[:,:,
0
] #
获得B通道图像g=img[:,:,1]
#获得G通道图像r=img[:,:,2]
#获得R通道图像cv
2.imshow('lena_B',b)
#显示B通道图像cv
2.imshow('lena_G',g)
#显示G通道图像cv
2.imshow('lena_R',r)
#显示R通道图像
cv
2.wait
Key(0)#读图像,将其尺寸减小为原来的2.使用cv
2.split()函数拆分通道cv
2.split()函数可以用于拆分通道,示例代码如下。
#test
2-11.py:使用cv
2.split()函数拆分通道
import
cv
2img=cv
2.imread('lena.jpg',cv
2.IMREAD_REDUCED_COLOR_
2)为原来的1/2cv
2.imshow('lena',img)
#显示原图像b,g,r=cv
2.split(img)
#按通道拆分图像cv
2.imshow('lena_B',b)
#显示B通道图像cv
2.imshow('lena_G',g)
#显示G通道图像cv
2.imshow('lena_R',r)
#显示R通道图像
cv
2.wait
Key(0)#读图像,将其尺寸减小
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《老年反流性咽喉炎专科护理|抗反流管理 + 全套护理措施》
- 弹簧制作工道德知识考核试卷含答案
- 糖坯制造工安全知识宣贯考核试卷含答案
- 危重病人家属的护理支持
- 铁路机车车辆制动钳工道德水平考核试卷含答案
- 钙镁磷肥生产工岗前工作效率考核试卷含答案
- 石脑油预处理装置操作工安全风险强化考核试卷含答案
- 中医护理技能操作考核标准
- 中职护理专业护理伦理与护理实践
- 纺粘和熔喷精密组件清理工创新应用测试考核试卷含答案
- 产业园项目施工组织设计
- 锻造车间质量考核制度
- 2025年注册安全工程师案例分析试卷(含答案)
- 员工节能培训
- 2026年制式离婚协议书民政局备案版
- 文件控制制度标准规范
- 危化品消防安全培训课件
- 《反有组织犯罪法》普法测试题及答案
- 2025北京建筑大学第二批招聘24人模拟试卷及答案详解(夺冠系列)
- 小升初复习知识点20盈亏问题
- 水土维持综合治理技术标准小型蓄排引水工程
评论
0/150
提交评论