番外2.OpenCV中摄像头捕获与视频处理与常见问题解决方案
家用吸尘器品牌
番外2.OpenCV中摄像头捕获与视频处理与常见问题解决⽅案
本系列专栏写作⽅式
本系列专栏写作将采⽤⾸创的问答式写作形式,快速让你学习到 OpenCV 的初级、中级、⾼级知识。
2. OpenCV 中摄像头捕获与视频处理
OpenCV 除了应⽤在图像处理领域外,还会应⽤到视频处理领域,接下来我们就将学习到,如何通过Python OpenCV 对摄像头捕获或者视频⽂件进⾏处理。
视频⽂件将从三个⽅向⼊⼿,分别是读取⽂件,显⽰视频,保存视频。
本⽂将为你核⼼解决以下2个函数:cv2.VideoCapture 与 cv2.VideoWrite,基于这2个函数,会衍⽣出其它相关函数,具体参照下⽂。
在 OpenCV 中操作摄像头相关注意事项和解决⽅案
摄像头相较于视频,差异在⼀个是实时图像,⼀个是既定内容。如果想要捕获到视频,⽤到的是cv2.VideoCapture 函数,该函数的第⼀个参数是设备的索引号,如果你使⽤的是笔记本电脑,默认⼀般是0,表⽰的内置摄像头,如果链接了外置,可以修改该数字即可。
最简单的测试代码如下:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, frame = ad()
# 转变成灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("frame", gray)
if cv2.waitKey()&0xFF==ord("x"):
关于国庆的黑板报
break
# 关闭摄像
cv2.destroyAllWindows()
该代码在运⾏时,如果你电脑未安装摄像头或者驱动异常,都会导致报错,例如下述BUG
error: (-215:Assertion failed)!_pty()in function'cv::cvtColor'
该问题虽然报错出现在 cv2.cvtColor函数,但是原因是 frame 为空,即ad()读取失败导致的。
这⾥在实际编码过程中,需要增加⼀个判断,ad() 函数会返回⼀个状态布尔值,如果读取到数据,返回真,否则返回假,测试如下代码(下述代码的停⽌,需要按键盘上的CTRL+C ):
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
一件烦心事作文400字四年级while True:
ret, frame = ad()
print(ret)
# 关闭摄像
cv2.destroyAllWindows()
测试完毕之后,我们修改本⽂⼀开始的代码,让其更加健壮。
while True:
ret, frame = ad()
if ret:
# 转变成灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("frame", gray)
# pass ...
这⾥存在⼀个常见,但是及容易被忽视的问题,就是很多时候,我们并不知道电脑上有没有摄像头,或者摄像头的设备号,该如何进⾏操作。
你可以按照下述代码进⾏检测:
import cv2
import numpy as np
for cn_num in range(0,5):
cap = cv2.VideoCapture(cn_num)周杰伦蜗牛歌词
if cap.isOpened():
break
以上代码运⾏的原理是,按照顺序依次打开设备 0~5,当发现摄像头被成功打开,返回跳出。
上述代码还提及了⼀个新的函数 cap.isOpened,该函数⽤来检测摄像头是否初始化(能被打开),初始化成功返回 True。
在 OpenCV 中操作视频⽂件相关注意事项和解决⽅案
其实操作视频⽂件与操作摄像头操作基本⼀致,唯⼀修改的就是cv2.VideoCapture 函数设备号即可。
这⾥将设备号修改为视频⽂件路径。
接下来,我们先看⼀段代码,认识基本⽤法。
import numpy as np
import cv2
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
ret, frame = ad()
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
if cv2.waitKey(25)&0xFF==27:
break
cv2.destroyAllWindows()
其中最需要注意的⼀个地⽅,不是 cv2.VideoCapture(‘test.mp4’) 函数读取⽂件,⽽是 cv2.waitKey(25),这个地⽅需要设置好对应的视频,如果数值特别⼩,例如 1,视频就会快速播放,设置太⾼播放⼜会变慢,⼀般建议设置为 25。
当然,上述代码注释的部分,如果取消,就会变成⼀个灰度视频。
甚⾄可以直接将视频进⾏翻转,⽤到函数为:cv2.flip(frame, 0),
import numpy as np
import cv2
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
ret, frame = ad()
if ret ==True:
frame = cv2.flip(frame,0)
cv2.imshow('frame', frame)
if cv2.waitKey(25)&0xFF==27:
break
cv2.destroyAllWindows()
上述代码运⾏如下:
接下来我们⽤视频来学习⼀下⼀些操作属性的⽅法。
(propId) 可以访问视频的某些功能,其中 propId 是⼀个从0到18的数字,每个数字表⽰视频的属性。取值清单如下(该清单只作为查询参考使⽤):
0 - cv2.CAP_PROP_POS_MSEC: 视频⽂件的当前位置(ms);
1 - cv2.CAP_PROP_POS_FRAMES:从0开始索引帧,帧位置;
2 - cv2.CAP_PROP_POS_AVI_RATIO:视频⽂件的相对位置(0表⽰开始,1表⽰结束);
3 - cv2.CAP_PROP_FRAME_WIDTH:视频流的帧宽度;
4 - cv2.CAP_PROP_FRAME_HEIGHT: 视频流的帧⾼度;
5 - cv2.CAP_PROP_FPS:帧率;
6 - cv2.CAP_PROP_FOURCC : 编解码器四字符代码;
7 - cv2.CAP_PROP_FRAME_COUNT :视频⽂件的帧数;
8 - cv2.CAP_PROP_FORMAT:retrieve()返回的Mat对象的格式;
9 - cv2.CAP_PROP_MODE :后端专⽤的值,指⽰当前捕获模式;
10 - cv2.CAP_PROP_BRIGHTNESS :图像的亮度,仅适⽤于⽀持的相机;
11 - cv2.CAP_PROP_CONTRAST :图像对⽐度,仅适⽤于相机;
12 - cv2.CAP_PROP_SATURATION:图像饱和度,仅适⽤于相机;
13 - cv2.CAP_PROP_HUE:图像⾊调,仅适⽤于相机;
14 - cv2.CAP_PROP_GAIN:图像增益,仅适⽤于⽀持的相机;
15 - cv2.CAP_PROP_EXPOSURE:曝光,仅适⽤于⽀持的相机;
16 - cv2.CAP_PROP_CONVERT_RGB:布尔标志,指⽰是否应将图像转换为RGB;
17 - cv2.CAP_PROP_WHITE_BALANCE:⽬前不⽀持;
18 - cv2.CAP_PROP_RECTIFICATION:⽴体摄像机的整流标志。
有了上述清单,可以获取视频较多的属性值了,例如获取宽度与⾼度。
cap = cv.VideoCapture('test.mp4')
print("宽度:%s,⾼度:%s"%((3), (4)))
有 get ⽅法,对应的就存在 set 函数,函数原型如下:
cap.set(propId,value)# 进⾏修改,value 是修改后的值
但这个地⽅要注意下,上⾯ set 函数只对采集摄像头有⽤,如果读取的是视频⽂件,上述内容就不在起作⽤了。
如果你还是希望实现修改视频⽂件的窗⼝⼤⼩,那可以使⽤下述⽅案。
cv2.namedWindow("frame",0)
如果想希望查看视频播放的当前位置、帧率、帧数,可以直接使⽤下述代码。
time = (cv2.CAP_PROP_POS_MSEC)
孔子名言名句大全fps = (cv2.CAP_PROP_FPS)
total_frames = (cv2.CAP_PROP_FRAME_COUNT)
当然,使⽤属性值也可以。
time = (0)
fps = (5)
total_frames = (7)
在 OpenCV 中捕获视频并保存
图⽚的保存使⽤函数 cv2.imwrite即可实现,但视频保存,需要与cv2.VideoCapture对应着,创建⼀个 VideoWriter对象,⽽且还需要确定⽂件的名称,视频 FourCC 编码,频率,帧⼤⼩,isColor标签,该标签如果为 True 则保存彩⾊图,否则是灰度图。
⾸先对 FourCC 进⾏⼀下说明,该编码是⼀个4字节码,表⽰的是视频编码格式。例如对于 MJPG,它有两种写法。
注意这是 OpenCV 3 写法,⽹上现在⼤多数博客都是 OpenCV 2 写法。
cv2.VideoWriter_fourcc('M','J','P','G')
cv2.VideoWriter_fourcc(*'MJPG')
常见编码说明:
MJPG编码器编码的视频⾮常⼤;
X264 编码器编码的视频很⼩;
XVID编码器优先选择,质量较⾼且体积较⼩。
cv2.VideoWriter函数原型如下:
cv2.VideoWriter( filename, fourcc, fps, frameSize[, isColor])
相关参数:
filename:视频保存⽂件名称;
fourcc:视频编解码器的4字节代码;
fps:帧率;
母亲节几月几号
frameSize:帧⼤⼩;
isColor:如果为True,则视频为彩⾊,否则为灰度视频,默认为True。
测试代码如下,代码之后跟相关问题的说明。
import numpy as np
import cv2
cap = cv2.VideoCapture("test.mp4")
width =(3))
height =(4))
fps = (5)
# FourCC 编码是 XVID
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("test1.avi", fourcc, fps,(width, height))
while1:
ret, frame = ad()
if frame is None:
break
else:
# 对每⼀帧都进⾏处理
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out.write(frame)
cv2.imshow("video", frame)
k = cv2.waitKey(25)&0xFF
if k ==27:
break
cv2.destroyAllWindows()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。