opencv-python基础
最后更新时间:
文章总字数:
预计阅读时间:
一.opencv-python简述
其使用Numpy,所有OpenCV数组结构都转换为Numpy数组,是一个高度优化的数据库操作库。
二.环境安装
1 |
|
三.基本概念
像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。
数字图像利用0/1编码记录信息,opencv中常用的是8位图像,大多数彩色和灰度图像使用8位(uint8)表示每个通道的像素值,范围从0到255,其中 0 最黑,1(255) 最白。
几乎所有颜色都可以通过RGB三原色按照不同比例调配而成。
注意:通过img.shape获取到(h,w,c),即高、宽、通道数。对高和宽分别进行遍历,可以得到每个像素点。此时获取到的值是BGR通道(b,g,r),b,g,r分别代表蓝、绿、红通道上的值。
四.图像存储
彩色图像:三维数组
灰度图像:二维数组(矩阵)
在OpenCV中,默认情况下,彩色图像是以BGR(蓝-绿-红)顺序存储
形状(Shape):
图像的尺寸由其高(h)、宽(w)和通道数(c)决定。可以通过 img.shape 属性获取(h,w,c)。
彩色图像,返回一个包含三个值的元组 (height, width, channels)。
灰度图像,返回一个包含两个值的元组 (height, width),因为其只有一个通道。
数据类型(dtype):图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。
- 单通道(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低越暗,值越高越亮。
五.图像基本操作
5.1 创建窗体(窗口)
1 |
|
参数:
winname:窗口名
窗口属性:窗口大小是否可调整
cv2.WINDOW_AUTOSIZE :默认,窗口会根据加载的图像自动调整到合适的大小,并且用户不能拖动窗口边缘来调整窗口大小。
cv2.WINDOW_NORMAL :窗口大小是可调整的,用户可以通过鼠标拖动窗口边缘来自由改变窗口大小。
1 |
|
运行后会出现两块窗口,暂时不管。
5.2 读取图像
1 |
|
参数:
filename:图像路径
读取方式:彩色·默认、灰色等
1 |
|
继续往下看。
5.3 图像显示
1 |
|
参数:
winname:显示图像的窗口名,以字符串类型表示
img:要显示的图像
1 |
|
结果:
5.4 保存图像
1 |
|
参数:
path:图片保存的路径和图片名
img:要保存的图像
1 |
|
5.5 创建黑色图像
使用 np.zeros() 创建全黑图像,再修改像素值(255)成为全白图像。
1 |
|
1 |
|
结果:
1 |
|
结果:
1 |
|
结果:
5.6 图像裁剪(切片)
img[y:y+h,x:x+w]
提取的是从 (x,y) 开始,高度为 h,宽度为 w 的矩形区域。
1 |
|
结果:
这里切记,opencv中坐标原点在图像的左上角,也就是w做横轴,h做纵轴。
5.7 调整大小
1 |
|
img:输入图像,通常是二维或三位NumPy数组。
dsize:输出图像的尺寸,是一个二元组 (w,h)
dst:缩放后的图像
1 |
|
结果:
六.图像绘制
6.1 直线
1 |
|
参数:
img:要绘制直线的图像
start、end:直线的起点和终点,都是两个元组(坐标)
color:直线的颜色,对于彩色图像,使用 BGR 格式(b,g,r)指定颜色
thickness:线条粗细,值越大越宽
隐藏参数,cv2.LINE_AA ,表示使用抗锯齿算法绘制图像,这在每个绘制函数中都隐式存在,默认为 cv2.LINE_8
1 |
|
结果:
6.2 圆形
1 |
|
参数:
img:要绘制圆形的图片
centerpoint、r:圆心和半径
color:线条颜色
tnickness:线条宽度,为-1时生成闭合图案并填充颜色
1 |
|
结果:
6.3 绘制矩形
1 |
|
参数:
img:要绘制矩形的图像
leftupper、rightdown:矩形的左上角和右下角坐标
color:线条的颜色
thickness:线条的宽度
1 |
|
结果:
6.4 绘制文本(向图片中添加文字)
1 |
|
参数:
img:要添加文字的图像
text:要写入的文本数据(此处是不能加中文的,会显示问号(?),matplotlib可以显示中文)
station:文本的放置位置
font:字体样式
Fontscale:字体大小
thickness:字体线条宽度
cv2.LINE_AA :使用反走样技术绘制文本边框
1 |
|
结果:
6.5 读取视频
cap = cv2.VideoCapture(path)
- path : 为0代表从默认摄像头捕获视频流
ret,frame = cap.read()
- 得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。
那视频都是一帧一帧的,我要怎么读取呢?来一起看看:
1 |
|
结果: