我最近在学习 OpenCV,这里会把可以直接运行的代码附上,希望可以帮助到学习 OpenCV 的同学。
内容:
- OpenCV 介绍
- OpenCV 的安装
- 图片的打开/保存
- 视频/摄像头的打开、帧操作,录制,保存
- 图片编辑操作:划线、添加文字等
OpenCV 介绍
OpenCV 的 全称是 Open Computer Vision,Open 表示开源的,Computer Vision 就是计算机视觉,也就是说 OpenCV 是开放源代码的计算机视觉技术。
OpenCV 由 Gary Bradsky 于 1999 年在英特尔创立,第一个版本于 2000 年发布。Vadim Pisarevsky 加入 Gary Bradsky 管理英特尔的俄罗斯软件 OpenCV 团队。2005 年,OpenCV 被用于获得 2005 年 DARPA 大挑战赛的车辆 Stanley。后来,它在 Willow Garage 的支持下继续积极发展,由 Gary Bradsky 和 Vadim Pisarevsky 领导该项目。OpenCV 现在支持多种与计算机视觉和机器学习相关的算法,并且日益扩展。
OpenCV 支持多种编程语言,如 C、Python、Java 等,可在不同平台上使用,包括 Windows、Linux、OS X、Android 和 iOS。基于 CUDA 和 OpenCL 的高速 GPU 操作接口也在积极开发中。
OpenCV-Python 是 OpenCV 的 Python 接口,结合了 OpenCV C API 和 Python 语言的最佳特性。Python 是由 Guido van Rossum 创立的通用编程语言,是当前非常流行的编程语言,主要是因为它的简单性和代码可读性。它使程序员能够在不降低可读性的情况下用更少的代码行来表达想法。
与 C/C 等语言相比,Python 速度较慢。也就是说,Python 可以很容易地使用 C/C 进行扩展,这允许我们在 C/C 中编写计算密集型代码并创建可以用作 Python 模块的 Python 包。这给了我们两个优势:首先,代码与原始 C/C 代码一样快(因为它是在后台运行的是 C 代码),其次,用 Python 编写代码比 C/C 更容易。OpenCV-Python 就是 C 实现的 Python 包。
OpenCV-Python 使用 Numpy,这是一个高度优化的库,用于具有 MATLAB 样式语法的数值运算。所有 OpenCV 数组结构都与 Numpy 数组相互转换。这也使得与使用 Numpy 的其他库(例如 SciPy 和 Matplotlib)集成变得更加容易,因此在学习 OpenCV-Python 之前,你需要先学习 Numpy,这样才能写出优化的代码。
OpenCV 的安装
不推荐编译源代码安装,因为太耗时间了。我们可以使用 pip 直接安装编译好的就行。
如果你想安装最新版本,可以这样:
代码语言:javascript复制pip install opencv-python
pip install opencv-contrib-python
b 站上的老师推荐,3.4.1.15 版本比较稳定,且没有专利限制,如果想安装这个版本,可以这样:
代码语言:javascript复制pip install opencv-python==3.4.1.15
pip install opencv-contrib-python==3.4.1.15
图片的打开/保存
注释都在里面了:
代码语言:javascript复制import cv2 as cv
import sys
# 打开一个图片
img = cv.imread("/Users/aaron/Downloads/IMG_4733.JPG")
if img is None:
sys.exit("Could not read the image.")
# 显示图片
cv.imshow("Display window", img)
# 参数 0 表示按任意键退出,其他数字表示等待制定的秒数后退出。
k = cv.waitKey(0)
if k == ord("s"): #如果按下的是字符 s
#保存图片
cv.imwrite("saved.jpg", img)
视频/摄像头的打开、帧操作,保存
API 可以参考:https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html
代码语言:javascript复制import cv2 as cv
# 0 表示第一个摄像头
# 也可以传入视频文件的路径
cap = cv.VideoCapture(0)
# cap = cv.VideoCapture("/Users/aaron/Downloads/0__xhfux2NnE3xtE_e.mp4")
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# 一帧一帧来读取
ret, frame = cap.read()
# 如果没有读取到:
if not ret:
print("无法获取视频帧,是不是播放结束了?Exiting ...")
break
# 这里可以对帧进行操作,比如转化为灰度图
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示帧
cv.imshow("frame", gray)
if cv.waitKey(1) == ord("q"): # 等待按键
break
# 结束后要释放资源
cap.release()
cv.destroyAllWindows()
视频的保存,比如说从摄像头录制视频,保存为 mp4 文件。
代码语言:javascript复制import cv2 as cv
cap = cv.VideoCapture(0)
# 定义视频编码
cap.set(3, 640)
cap.set(4, 480)
fourcc = cv.VideoWriter_fourcc(*"mp4v")
out = cv.VideoWriter("output.mp4", fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("无法获取视频帧,Exiting ...")
break
# 帧反转操作
# frame = cv.flip(frame, 0)
# 保存帧
out.write(frame)
cv.imshow("frame", frame)
if cv.waitKey(1) == ord("q"): # 这里的等待 1 秒其实控制着速度
break
cap.release()
out.release()
cv.destroyAllWindows()
图片的操作、划线、添加文字
代码语言:javascript复制import numpy as np
import cv2 as cv
def img_show(img):
# 定义一个函数显示图片,这样可以少写代码。
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyWindow("img")
# 画一个黑色背景图
img = np.zeros((512, 512, 3), np.uint8)
# 一条蓝色的线 Blue Green Red (255,0,0)
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# 画一个矩形
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
# 画一个圆
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
# 画一个椭圆
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
# 画一个多边形
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (0, 255, 255))
# 添加文字
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, "OpenCV", (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)
img_show(img)
效果就是这样的: