OpenCV-Python学习笔记(一)


  • 使用工具Python3.6.8

  • 使用numpy;opencv;matplotlib


1. OpenCV的图像读取显示及保存

1
如果用的是64位系统,需将k=cv2.waitKey(0)改k=cv2.waitKey(0)&0xff
1
2
3
4
5
6
7
8
9
10
import cv2

img = cv2.imread('08.jpg',0)
cv2.imshow('img',img) #运行显示图片如图output_1
k = cv2.waitKey(0)&0xff
if k==27:
cv2.destroyAllWindows()
elif k==ord('s'):
cv2.imwrite('08.png',img)
cv2.destroyAllWindows()
1
2
3
4
5
6
7
8
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('08.jpg',0)
plt.imshow(img,cmap='gray',interpolation='bicubic')
plt.xticks([]),plt.yticks([]) #to hide tick values on X and Y axis
plt.show() #如图output_2
output_1:

output_2:


2. OpenCV视频操作

  • 学习阅读视频,显示视频和保存视频。
  • 学习从摄像头捕捉并显示它。
  • 您将学习这些功能:cv2.VideoCapture()cv2.VideoWriter()
1、用摄像头捕获视频

cv2.VideoCapture() :0为默认计算机默认摄像头,1可以更换来源;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2
cap = cv2.VideoCapture(0)
while True:
# capture frame-by-frame
ret, frame = cap.read()

# our operation on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

#display the resulting frame
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xff == ord('q'): # 按q键退出
break

# when everything done , release the capture
cap.release()
cv2.destroyAllWindows()

cap.read()返回一个布尔True/False。如果帧被正确读取,则为True。所以你可以通过检查这个返回值来检查视频的结束。

有时候,cap可能没有初始化捕获。在这种情况下,这段代码显示错误。你可以通过cap.isOpened()方法检查它是否被初始化。如果它是True,好的。否则使用cap.open()打开它。

您还可以使用cap.get(propId)方法访问此视频的某些功能,其中propId是一个从0到18的数字。每个数字表示视频的一个属性(如果该视频适用于该视频),详细信息可以在这里可以看到:属性标识符。其中一些值可以使用cap.set(propId,value)进行修改。 值是你想要的新值。

例如,其中一些值可以使用cap.set(propId,value)来修改,例如cap.get(3)cap.get(4)来查看每一帧的宽和高,默认是640x480。我们可以使用ret=cap.set(3,320)ret = cap.set(4,240)来把宽和高改成320x240

2、从文件中播放视频

把设备索引号改成文件名即可。在播放每一帧时,使用cv2.waitKey()适当持续时间,如果它太少,视频会非常快,如果它太高,视频会很慢(那么,这是如何以慢动作显示视频)。正常情况下,25ms即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2

cap = cv2.VideoCapture('mm.avi')

while (cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

代码中尝试修改视频流的一些属性:

3、保存视频

所以我们拍摄一个视频,逐帧处理,我们要保存视频。对于图像来说,这非常简单,只是使用cv2.imwrite()。 但是视频需要更多的工作。

创建一个VideoWrite的对象,确定输出文件名,指定FourCC编码,播放频率和帧的大小,最后是isColor标签True为彩色。 FourCC是一个4字节码,用来确定视频的编码格式。

  • 1、In Fedora : DIVX , XVID , MJPG , X264 , WMV1 , WMV2 XVID是最好的,MJPG是高尺寸视频,X264得到小尺寸视频
  • 2、In Windows : DIVX
  • 3、In OSX :不知道用什么好

设置FourCC格式时,原文里采用了·cv2.VideoWriter_fourcc()·这个函数,若运行程序的时候显示这个函数不存在,可以改用了·cv2.cv.CV_FOURCC·这个函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while (cap.isOpened()):
ret, frame = cap.read()
if ret == True:
frame = cv2.flip(frame, 1) #0--垂直翻转;1--水平翻转;-1--水平垂直翻转

# write the flipped frame
out.write(frame)

cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()