计算机视觉是人工智能和计算机科学的一个分支,它使计算机能够理解视觉世界。它是机器学习的主要组成部分之一,处理自然世界的图像(高维数据)。它执行各种任务,如获取、分析和处理,以理解图像并将它们转换成数值或符号信息。
当今的计算机视觉算法基于模式识别,通常依赖于卷积神经网络(CNN)。由于该领域的各种进步,计算机视觉正在蓬勃发展,在过去几年中其受欢迎程度呈指数级增长。其应用范围从缺陷检测到入侵者检测,口罩检测到肿瘤检测,作物监测到植物监测,车辆分类到交通流量分析等。这项技术主要用于零售和制造业、交通、媒体、农业、医疗保健、体育、银行、增强现实、家庭安全等领域。
Python包含了一个名为OpenCV的库,用于计算机视觉领域的工作。这是一个开源库,于1999年推出。可以执行图像处理、图像分析、视频分析等任务。这个库主要是用C++编写的,并且有C++、Python、Java和MATLAB接口可供使用。
OpenCV可以轻松使用pip命令安装,如下所示:
pip install opencv-python
使用OpenCV处理图像时,可以执行许多操作。其中,将讨论以下内容:
- 读取图像
- 调整图像大小
- 旋转图像
- 翻转图像
- 重写图像
- 裁剪图像
- 在图像上绘制各种形状
以下是使用OpenCV读取图像的示例代码:
import cv2
img = cv2.imread('img.jpeg')
cv2.imshow('Image', img)
cv2.waitKey()
cv2.destroyAllWindows()
在图像处理中,通常需要调整图像大小。OpenCV为提供了几种方法来轻松调整图像大小。让通过一个示例来理解。
img2 = cv2.resize(img, (400, 400))
# 按原始大小的比例调整大小
img3 = cv2.resize(img, (0, 0), fx=0.5, fy=0.6)
# 使用INTER_AREA缩小图像
img4 = cv2.resize(img, (600, 700), interpolation=cv2.INTER_AREA)
使用OpenCV旋转图像的语法如下:
M = cv2.getRotationMatrix2D(center, angle, scale)
img_rotated = cv2.warpAffine(src, M, (h, w))
让通过一个示例深入了解:
# 计算高度和宽度以获得中心
(h, w) = img.shape[:2]
center = (w / 2, h / 2)
# 旋转90度
M = cv2.getRotationMatrix2D(center, 90, 1.0)
img90 = cv2.warpAffine(img, M, (h, w))
# 旋转180度
M = cv2.getRotationMatrix2D(center, 180, 1.0)
img180 = cv2.warpAffine(img, M, (h, w))
# 旋转270度
M = cv2.getRotationMatrix2D(center, 270, 1.0)
img270 = cv2.warpAffine(img, M, (h, w))
要翻转图像,使用函数cv2.flip()并传递参数,即图像和翻转代码(水平或垂直):
# 水平翻转
img = cv2.flip(img, 0)
# 垂直翻转
img = cv2.flip(img, 1)
要重写图像到新文件,使用函数imwrite()如下:
cv2.imwrite('new_img.jpg', img)
裁剪图像:
# 从顶部裁剪
img = img[0:100, 0:100]
# 指定高度和宽度裁剪
img = img[50:200, 50:100]
使用OpenCV,可以快速在图像上绘制各种形状,如圆形、矩形、多边形等,使用不同的函数。让通过一个示例来理解:
# 创建一个空白图像
import cv2 as cv2
import numpy as np
img = np.zeros((500, 500, 3), dtype=float)
# 将图像颜色更改为绿色
img[:] = 0, 255, 0
# 红色
img[:] = 0, 0, 255
# 更改特定部分的颜色
img[200:300, 300:450] = 0, 255, 0
# 绘制矩形
cv2.rectangle(img, (100, 100), (180, 180), color=(255, 0, 0), thickness=5)
# 用颜色填充绘制圆形
cv2.circle(img, center=(100, 300), radius=60, color=(0, 255, 0), thickness=-1)
# 绘制线条
cv2.line(img, (0, 0), (317, 356), thickness=3, color=(0, 255, 0))
# 添加文本
cv2.putText(img, org=(50, 50), fontScale=3, color=(255, 0, 0), thickness=2, lineType=cv2.LINE_AA, text="IMAGES", fontFace=cv2.FONT_HERSHEY_COMPLEX_SMALL)
cv2_imshow(img)
cv2.waitKey(0)
视频是一系列帧或一系列图像的序列。图像通常以BGR(蓝色、绿色、红色)的形式存在。每个像素的值在0-255之间。要开始使用OpenCV处理视频,使用以下函数:
- Cv2.VideoCapture():建立与视频的连接。它接受一个参数,指示是否使用内置摄像头或附加摄像头。值‘0’表示内置摄像头。
- Cap.read():此方法允许获取一帧。
- Cv2.cvtColor():允许更改图像使用的颜色模型。这包括从BGR转换到RGB和灰度。
在处理视频时,将学习如何捕获视频帧的不同属性、读取视频文件和写入视频。
以下是捕获视频帧属性的一些示例。要捕获帧的形状:
frame.shape
(2160, 3840, 3)
plt.imshow(frame)
plt.show()
要更改帧的颜色,使用函数cv2.cvtColor()如下所示:
# 更改帧的颜色
plt.show()
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY))
要捕获视频,使用函数cv2.VideoCapture():
cap = cv2.VideoCapture('/content/video.mp4')
cap.read()
要获取帧的高度,使用cap.get()函数如下:
# 高度
cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
要获取帧的宽度,使用:
# 宽度
cap.get(cv2.CAP_PROP_FRAME_WIDTH)
要获取帧数,使用函数cap.get()如下:
# 帧数
cap.get(cv2.CAP_PROP_FRAME_COUNT)
要获取每秒帧数,使用:
# 每秒帧数
cap.get(cv2.CAP_PROP_FPS)
以下是读取视频文件的示例代码:
# 导入依赖
import cv2
from matplotlib import pyplot as plt
# 建立捕获
cap = cv2.VideoCapture('/content/video.mp4')
# 循环遍历每个帧
while(cap.isOpened()):
ret, frame = cap.read()
frame = cv2.resize(frame, (1200, 700))
cv2.imshow('Video', frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
# 关闭所有内容
cap.release()
cv2.destroyAllWindows()
import cv2
from google.colab.patches import cv2_imshow
cap = cv2.VideoCapture('/content/video.mp4')
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_size = (width, height)
video_writer = cv2.VideoWriter('/content/output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, frame_size)
for frame_idx in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
video_writer.write(gray)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- 什么是计算机视觉
- OpenCV库的应用
- 使用OpenCV库处理图像
- 使用OpenCV库处理视频