1999年,英特尔的 Gary Bradsky 发起了 OpenCv 项目,并于 2000 年发布第一个版本。2005年,OpenCv 被首次应用在 Stanley,这也是赢得同年 DARPA 大挑战赛的车型。如今,OpenCv 除了支持计算机视觉,还增加了众多机器学习相关算法,未来还将持续扩展。
OpenCV 支持众多主流编程语言,如:C++,Python,Java 等,可在不同的平台上使用,包括 Windows,Linux,OS X,Android 和 iOS。此外,基于 CUDA 的高速 GPU 运算接口,和 OpenCL 也在开发当中。
本文介绍的是 OpenCv 的 Python 接口,即 OpenCV-Python
,但它并非 OpenCv 的 Python 实现,而仅仅是原生 OpenCv C++ 实现的 Python 包装,也就是说,我们可以像普通 Python 模块一样导入使用,但后台运行的依然是 C++ 程序,这样既发挥了 Python 的简单易用性,也充分利用了 C++ 的执行高效性,可谓两者兼得。
值得注意的是,OpenCv-Python 使用 numpy 进行数值运算,所有的 OpenCv(C++)的数组结构都在内部转换成 numpy 数组。当然,这也使得它更容易与其他使用 numpy 的库集成,如:Scipy 和 Matplotlib 。
pip install opencv-python
导入模块:
import cv2 as cv
使用 cv.imread()
打开图片,返回的是一个 numpy 数组。
img = cv.imread('dog.jpeg')
print(type(img), img.shape)
(320, 320, 3)
上面得到是彩色图片的 numpy 数组,也可以直接得到灰度图片的 numpy 数组。
img_gray = cv.imread('dog.jpeg', 0)
print(type(img_gray), img_gray.shape)
(320, 320)
使用 cv.imshow()
显示图片,会打开一个窗口 GUI 界面,自动缩放图片到适合显示的大小,并跟踪鼠标移动,在图片下方跟踪栏,显示当前位置和像素值。imshow()
第一个参数是窗口界面标题,如下图 “image” 。
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()
如果对读取的图片数据(numpy 数组)进行了修改,想保存修改后的图片保存到磁盘,就需要用到 cv.imwrite()
,函数接收两个参数,第1个参数为保存的文件名,第2个参数为图像数据,即 numpy 数组。
cv.imwrite('dog_gray.png', img_gray)
True
我们已经知道如何使用 opencv-python 打开,显示,保存图片,那么综合应用起来,可以做一个完整的小程序。
打开并读取图片灰度数据,显示图片窗口,等待用户键盘输入,按 ESC
键退出,按字母 s
键保存灰度图并退出。
img = cv.imread('dog.jpeg', 0) # 打开灰度图
cv.imshow('dog', img) # 在窗口显示图片
k = cv.waitKey(0) # 持续等待键盘事件
if k == 27: # 按 ESC 键退出
cv.destroyAllWindows()
elif k == ord('s'): # 按字母 s 键保存并退出
cv.imwrite('dog_gray.png',img)
cv.destroyAllWindows()
从笔记本电脑内置摄像头,捕获实时视频流(一张张图片),并显示经过灰度处理后的视频帧,效果就是经过灰度处理后的视频。
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("无法打开视频输入设备!")
exit()
while True:
# 一帧一帧读取视频
ret, frame = cap.read()
# 如果成功读取到视频帧,返回 True
if not ret:
print("无法接收视频输入,请检查是否开启设备访问权限。正在退出程序...")
break
# 在此执行对帧的处理操作
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示处理后的帧
cv.imshow("Capture Live Video Stream", gray)
# 按字母 q 键退出程序
if cv.waitKey(1) == ord('q'):
break
# 释放设备访问,关闭所有窗口
cap.release()
cv.destroyAllWindows()
cap = cv.VideoCapture('dance.mp4')
while cap.isOpened():
# 一帧一帧读取视频
ret, frame = cap.read()
# 如果成功读取到视频帧,返回 True
if not ret:
print("无法接收视频输入,请检查是否开启设备访问权限。正在退出程序...")
break
# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('Play Video File', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
从视频输入设备,如笔记本电脑内置摄像头,捕获实时视频流输入,进行一帧帧处理后,保存到文件 output.avi 。
cap = cv.VideoCapture(0)
# 定义编解码器并创建 VideoWriter 对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("无法接收视频输入,请检查是否开启设备访问权限。正在退出程序...")
break
# 对每一帧进行垂直翻转
frame = cv.flip(frame, 0)
# 写入翻转后的帧
out.write(frame)
cv.imshow('Capture Live Video Stream', frame)
if cv.waitKey(1) == ord('q'):
break
# 线程结束,释放所有资源
cap.release()
out.release()
cv.destroyAllWindows()
坚持写专栏不易,如果觉得本文对你有帮助,记得点个赞。感谢支持!
微信扫描二维码 获取最新技术原创