文章目录
前言
- 目前,我开始学习OpenCV的相关概念和操作。通过今天的学习,我掌握了OpenCV的基础概念与图像操作
一、OpenCV简介
- OpenCV(开放源代码计算机视觉库)是一个开源的计算机视觉和机器学习软件库。由一系列 C++ 类和函数构成,用于图像处理、计算机视觉领域的算法实现。
- OpenCV-Python是原始OpenCV C++实现的Python包装器。
- OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。
二、计算机中的图像表达
1.图像表示
- 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。
- 一系列像素组合到一起就形成了完整的图像。
- 我们平常接触的图像都是8位数图像,范围从0到255,其中0,代表最黑,1,表示最白。
- 日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的。
2.图像存储
- 在OpenCV中,图像通过Numpy数组进行存储
- 灰色图像使用二维数组,而彩色图像使用三维数组进行存储
- 图像的常用属性分别为:shape和dtype,用于访问数组的形状和像素的数据类型
- 需要注意的是:在OpenCV中,彩色图像以BGR顺序存储
三、基本图像操作
1.创建窗口
- cv2.namedWindow(winname [,窗口属性])
- winname指窗口名
- 窗口属性包括:cv2.WINDOW_AUTOSIZE,cv2.WINDOW_NORMAL;用以指定窗口大小是否能进行调整
tips:可以在imshow方法中指定窗口名从而省略该步骤
python
cv.namedWindow('window1',cv.WINDOW_AUTOSIZE) #cv.WINDOW_AUTOSIZE表示不能调整窗口大小
cv.namedWindow('window2',cv.WINDOW_NORMAL) #cv.WINDOW_NORMAL表示可调整窗口
2.读取图像
- cv2.imread(path [,读取方式])
- 可以指定读取彩色或灰白图像
python
img2 = cv.imread('cat1.png',cv.IMREAD_GRAYSCALE) #读为灰度图
3.显示图像
- cv2.imshow(winname,img)
- winname:显示图像的窗口名,以字符串类型表示
- img:要显示的图像
python
cv.imshow('window2',img)
- 直接调用该函数会导致显示出现问题,需要结合使用cv.waitKey(),cv.destroyAllWindows()指定绘图停留时间以及释放资源
python
cv.imshow('window2',img)
cv.waitKey(0) #给图像绘制留下时间
cv.destroyAllWindows() #释放资源
4.保存图像
- cv2.imwrite(path,img)
- 将图片保存到指定路径
python
cv.imwrite('gray.png',img2)
5.创建黑白图像
- 由于OpenCV使用Numpy数组对图像进行存储,因此我们可以使用Numpy来创建对应的图像数组
python
import cv2 as cv
import numpy as np
h = 480
w = 480
img = np.zeros((h,w,3),dtype=uint8)
cv.imshow('img',img)
img[:,:,:] = 255
cv.imshow('img1',img)
cv.waitKey(0)
cv2.destroyAllWindows()
- 以下展示生成随机颜色的图像
python
h = 480
w = 480
img = np.zeros((h,w,3),dtype=uint8)
img[:,:,:] = np.random.randint(0,256,(h,w,3))
cv.imshow('random',random_img)
cv.waitKey(0)
cv.destroyAllWindows()
6.图像切片
- 对图像进行切片相当于对图像对应的Numpy数组进行切片
python
img = cv.imread('cat1.png')
print(img.shape)
y = 70
x = 100
w = 250
h = 250
img1 = img[y:y+w,x:x+h]
cv.imshow('img1',img1)
cv.imshow('img2',img)
cv.waitKey(0)
cv.destroyAllWindows()
tips:需要注意的是,OpenCV里的坐标系和数学中的直角坐标系有区别;h对应的是垂直方向,w对应的是水平方向
7.图像大小调整
- cv2.resize(img,dsize,dts)
- 结果返回一个新的图像数组
python
img = cv.imread('cat1.png')
new_img = cv.resize(img,(480,100))
cv.imshow('img',new_img)
cv.waitKey(0)
cv.destroyAllWindows()
四、读取视频
- 视频是由一帧一帧的图片组合而成,读取视频本质上也是在读取图片
- cap = cv2.VideoCapture(path)
- ret,frame = cap.read()
- 首先创建VideoCapture类的对象,再使用该对象调用read方法读取视频
- 返回值ret是一个布尔值,用于判断是否读取成功;frame代表一帧图像
python
cap = cv.VideoCapture(r'D:\AI\code\OpenCV\20221112_09:42:12_1.mp4') #本地读取视频
cap1 = cv.VideoCapture(0) #从摄像头读取视频流
while True:
ret,frame = cap.read()
if not ret:
print("读取结束")
break
cv.imshow('frame',frame)
# 等待40毫秒并检查按键事件,获取按键的ASCII码,判断按键是否为q键
if cv.waitKey(40) & 0xFF==ord('q'):
break
cap.release()
cv.destroyAllWindows()
THE END