【视频教程】对视频进行基本操作
今天看了场直播,偶然想到自己数据处理有文本、图像,但是大数据时代数据不止文本和图像,还有音频和视频。由于之前接触了OpenCV,我觉得视频是连续的图片组成的,还是比较好理解。
呃,说的很高大上。其实很简单,太难的东西咱们文科生也玩不了。就玩点简单的,拾人牙慧把。今天我就现学现用,写这篇文章。
https://v.qq.com/txp/iframe/player.html?vid=a0546pgp20v&width=500&height=375&auto=0
直播大邓
现在手头上没有视频,就用摄像头录来的视频玩玩。大家也没看到过活生生的大邓的光辉形象,今天就让大家一睹为快,😆。
一、实战加讲解
1.1捕捉摄像头
想用电脑上的摄像头捕捉自己,首先要用python脚本捕捉摄像头。
import cv2
#捕捉摄像头 参数0别去掉哦
cap = cv2.VideoCapture(0)
1.2摄像头对象进行读取
得到的cap,我们要读取数据,才能进行后续的操作。python cap.read()
问题来了,cap.read()返回的是什么呢?
没关系,不懂cap.read()返回啥,咱们就打印运行一下。
print(cap.read())
返回
(True, array([[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
...,
...,
...,
...,
[ 0, 0, 42],
[ 0, 0, 42],
[ 0, 0, 42]]], dtype=uint8))
从上面看,返回的是一个元组。 元组第一个元素是布尔值,第二个元素是矩阵。根据之前OpenCV知识(对此不懂的,请去观看大邓最近几期OpenCV公众号),矩阵应该就是图像矩阵。
那么有用的是矩阵数据。我们可以通过
ret,frame = cap.read()
将矩阵数据找到并赋值给frame
1.3视频显示
多幅图片连续播放就组成了动画,如果播放频率高一些,频率超过人类肉眼的阈值,就成了视频。
因为刚刚cap.read()是捕捉摄像头拍照。拍的仅仅是一张。为了连续,我们这里使用while循环,持续连续的拍照并展示。
在这里我们延时1ms,持续拍照并显示。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret,frame = cap.read()
cv2.imshow('我的摄像', frame)
#延时1ms显示 键盘q按下
if cv2.waitKey(1)&0xFF==ord('q'):
#退出while循环,退出程序
break
#python释放摄像头
cap.release()
#关闭所有窗口
cv2.destroyAllWindows()
二、对视频进行其他操作
2.1视频灰度化
灰度化图像,在之前的文章中有公式法、平均法和cvtColor法。今天直接使用OpenCV封装的方法。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret,frame = cap.read()
cvt_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('我的摄像', cvt_frame)
# 延时1ms显示
if cv2.waitKey(10)&0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
2.2视频日落化
日落效果,将图像矩阵的蓝色与绿色调整为原来的70%
import cv2
cap = cv2.VideoCapture(0)
while True:
ret,frame = cap.read()
#获取视频图像的高row_num和宽column_num
row_num = frame.shape[0]
column_num = frame.shape[1]
#对图像中所有的像素点的蓝色与绿色,亮度变为原来的70%
for row in range(row_num):
for column in range(column_num):
frame[row, column, 0] = frame[row, column, 0]* 0.7
frame[row, column, 1] = frame[row, column, 1] * 0.7
cv2.imshow('我的摄像', frame)
# 延时1ms显示
if cv2.waitKey(10)&0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
2.3视频负片化
日落效果,将图像矩阵的Blue、green、red调整为255-blue、255-green、255-red
import cv2
cap = cv2.VideoCapture(0)
while True:
ret,frame = cap.read()
row_num = frame.shape[0]
column_num = frame.shape[1]
#负片,rgb变为 255-rgb
for row in range(row_num):
for column in range(column_num):
frame[row, column, 0] = 255-frame[row, column, 0]
frame[row, column, 1] = 255-frame[row, column, 1]
frame[row, column, 2] = 255-frame[row, column, 2]
cv2.imshow('我的摄像', frame)
# 延时1ms显示
if cv2.waitKey(10)&0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
2.4视频加水印文字
import cv2
cap = cv2.VideoCapture(0)
while True:
ret,frame = cap.read()
# 文字在图中的坐标(注意:这里的坐标原点是图片左上角)
x, y = 400, 400
cv2.putText(img=frame, text='Handsome guy',
org=(x, y), fontFace=cv2.FONT_HERSHEY_TRIPLEX,
fontScale=1, color=(255, 255, 255))
cv2.imshow('我的摄像', frame)
# 延时1ms显示
if cv2.waitKey(10)&0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
更多联想
人脸识别。比如之前写的人脸识别,其实也可以做到的,大家感兴趣的可以自己动手试一试,怎么样实现摄像头捕捉人脸,并显示出来。
平铺视频
图像旋转
加特效,比如现在流行的