OpenCV For Python Ep.1 Intro

Python OpenCV Ep.1 入门

OpenCV是一个十分强大的计算机视觉开源平台,其不仅拥有大量现成的算法,还支持包含Python、C++在内的多种语言。对于刚入门计算机视觉的人来说,Python+OpenCV的学习环境是十分友好的。

1.环境配置

首先需要确认已经安装numpy库,该库为OpenCV的前置要求,安装方法可以与下文一样地使用pip

我们可以使用pip直接安装OpenCV:

1
pip install opencv-python

或者可以选择安装包含了额外模型的contri版本:

1
pip install opencv-contirb-python

鉴于pip默认的下载源下载速度较慢,推荐使用pypi的清华镜像或豆瓣镜像:

1
pip install <package name> -i https://pypi.douban.com/simple/

再或者,可以直接去pypi下载对应的whl文件,再使用pip安装,但是速度可能与第一种差不多。

安装完成后,我们只需要在建立Python程序时加入:

1
import cv2

即可,其他多样化地import方式可以自行决定。

2.初步使用

作为计算机视觉库,不难想到我们第一步要做的就是获取图像处理的对象:图片和视频。

读入图像

在读入图像时,我们常用到的函数有:imread()imshow()

我们写一个简单的程序来读入和显示一张图像:

1
2
3
4
5
6
import numpy as np
import cv2

img = cv2.imread("<Pic>") # <Pic>为一个图像的路径
cv2.imshow("<Window Name>",img) # <Window Name>为窗口名称
cv2.waitKey(0)

只要设置好图像路径和窗口名,在确保路径正确的情况下,运行程序之后就可以得到一个图像显示窗口。但是运行后窗口只是一闪而过,要让窗口持续显示,则可以使用waitKey()函数。这样窗口就可以持续显示,并在按下任意按键后退出。

写入图像

如果要保存一张图像,我们需要用到imwrite()函数。

以前文程序为例,我们可以简单的实现把一张.png图片保存为.jpg图片的操作:

1
2
3
4
5
6
7
8
9
import numpy as np
import cv2

img = cv2.imread("<Pic(png)>") # <Pic(png)>为一个png图像的路径
cv2.imshow("<Window Name>",img) # <Window Name>为窗口名称
key = cv2.waitKey(0)

if key == ord("s"):
cv2.imwrite("<Pic(jpg)>",img) #<Pic(jpg)>为保存对象图片的位置路径

我们对按下的按键进行判断,如果按下了s键,就保存该图片到一个新的路径,例如D:\\pic.jpg

运行之后,如果我们以按下s键来关闭窗口,就可以保存下图像了。强烈建议使用绝对路径来作为保存路径,以免将图片存到Python运行路径或其他路径下。(后文存储视频同理)

读取摄像头图像

为了获取摄像头图像,我们需要使用VideoCapture()函数来创建一个视频捕获对象。

显示摄像头的程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0) #parameter is the number for your camera devices or #a video path.
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Add flip on the frame
frame = cv.flip(frame,1,dst = None)
# Display the resulting frame
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

我们将cap作为一个视频捕获对象,先用判断语句确定是否打开了视频或摄像头,再进入一个循环,以逐帧的方式来获取摄像头信息。我们仍然可以用imshow()函数来在窗口中显示获得的图像信息,在循环中同样也用了waitKey()函数来作为退出循环的条件。

比较特别的是在imshow()之前,我们做了比较简单图像处理工序——水平翻转。使用flip()函数,我们可以对图像进行各种类型的翻转,参数第二项的代号代表着不同的翻转方式,例如最典型的水平翻转为编号为1,垂直翻转编号为0

对于VideoCapture()中的摄像设备编号,建议结合具体电脑的设备信息使用,如果有虚拟摄像头(例如Facerig)或其他设备的话,可能会使实际的摄像头的编号向后改变。

存储视频

存储视频时我们需要用到VideoWriter_fourcc()VideoWriter()函数。

其中第一个函数用于创建编码格式,第二个函数用于创建视频的具体参数。

对于编码格式可以具体查阅FourCC相关的编码知识,具体编码与程序运行的平台有关,在Windows可以使用DIVX进行测试。

对于视频参数,其格式为(视频文件名,编码格式对象,每秒帧数,视频尺寸)

从摄像头里获取影像,并存储为视频的程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'DIVX')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

这次我们使用了垂直翻转作为处理操作。在按下q键退出之后,就可以在路径内找到对应的视频文件了。

3.参考与扩展

OpenCV-Python Tutorial:官方教程地址

FourCC:FourCC视频编码官方地址

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 Jzjerry Jiang
  • Visitors: | Views:

请我喝杯咖啡吧~