使用opencv进行视频处理,可以用到其中的VideoCapture方法获取视频路径,通过cap.get方法获取视频帧数;cvtColor是对视频颜色空间进行转换,其支持的转换类型和转换码如下:
1、RGB和BGR(opencv默认的彩色图像的颜色空间是BGR)颜色空间的转换
cv::COLOR_BGR2RGB
cv::COLOR_RGB2BGR
cv::COLOR_RGBA2BGRA
cv::COLOR_BGRA2RGBA
2、向RGB和BGR图像中增添alpha通道
cv::COLOR_RGB2RGBA
cv::COLOR_BGR2BGRA
3、从RGB和BGR图像中去除alpha通道
cv::COLOR_RGBA2RGB
cv::COLOR_BGRA2BGR
4、从RBG和BGR颜色空间转换到灰度空间
cv::COLOR_RGB2GRAY
cv::COLOR_BGR2GRAY
cv::COLOR_RGBA2GRAY
cv::COLOR_BGRA2GRAY
5、从灰度空间转换到RGB和BGR颜色空间
cv::COLOR_GRAY2RGB
cv::COLOR_GRAY2BGR
cv::COLOR_GRAY2RGBA
cv::COLOR_GRAY2BGRA
6、RGB和BGR颜色空间与BGR565颜色空间之间的转换
cv::COLOR_RGB2BGR565
cv::COLOR_BGR2BGR565
cv::COLOR_BGR5652RGB
cv::COLOR_BGR5652BGR
cv::COLOR_RGBA2BGR565
cv::COLOR_BGRA2BGR565
cv::COLOR_BGR5652RGBA
cv::COLOR_BGR5652BGRA
7、灰度空间域BGR565之间的转换
cv::COLOR_GRAY2BGR555
cv::COLOR_BGR5552GRAY
8、RGB和BGR颜色空间与CIE XYZ之间的转换
cv::COLOR_RGB2XYZ
cv::COLOR_BGR2XYZ
cv::COLOR_XYZ2RGB
cv::COLOR_XYZ2BGR
9、RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
cv::COLOR_RGB2YCrCb
cv::COLOR_BGR2YCrCb
cv::COLOR_YCrCb2RGB
cv::COLOR_YCrCb2BGR
10、RGB和BGR颜色空间与HSV颜色空间之间的相互转换
cv::COLOR_RGB2HSV
cv::COLOR_BGR2HSV
cv::COLOR_HSV2RGB
cv::COLOR_HSV2BGR
11、RGB和BGR颜色空间与HLS颜色空间之间的相互转换
cv::COLOR_RGB2HLS
cv::COLOR_BGR2HLS
cv::COLOR_HLS2RGB
cv::COLOR_HLS2BGR
12、RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
cv::COLOR_RGB2Lab
cv::COLOR_BGR2Lab
cv::COLOR_Lab2RGB
cv::COLOR_Lab2BGR
13、RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
cv::COLOR_RGB2Luv
cv::COLOR_BGR2Luv
cv::COLOR_Luv2RGB
cv::COLOR_Luv2BGR
14、Bayer格式(raw data)向RGB或BGR颜色空间的转换
cv::COLOR_BayerBG2RGB
cv::COLOR_BayerGB2RGB
cv::COLOR_BayerRG2RGB
cv::COLOR_BayerGR2RGB
cv::COLOR_BayerBG2BGR
cv::COLOR_BayerGB2BGR
cv::COLOR_BayerRG2BGR
cv::COLOR_BayerGR2BGR
在这里,我们选择范志毅“脸都不要了”名场面视频进行视频处理。
import cv2
video_path='fzy.mp4'
image_save='./imgs'
cap=cv2.VideoCapture(video_path)
video_frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
# print(video_frame_count)
for i in range(int(video_frame_count)):
_,img=cap.read()
img=cv2.cvtColor(img,cv2.COLOR_RGB2HLS)
cv2.imwrite('./imgs/image{}.jpg'.format(i),img)
需要注意的是,在执行代码前需要先在根目录下建立imgs文件夹,否则会产生报错。执行代码后,imgs文件夹内是逐帧切分的图片信息,序号按图片顺序排列。
这里介绍两种方法。
第一种是使用ffmpeg工具。
Mac系统中可以使用homebrew来进行安装——brew install ffmpeg
ffmpeg -i input.mp4 output.avi
视频格式转换
ffmpeg -i input.mp4 -vn -acodec copy output.m4a -vn
取消视频输出 -acodec 指定音频编码 copy代表不进行重新编码 提取一个视频文件中的音频文件
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
-an 取消音频输出 -vcodec 指定视频编码 copy代表不进行重新编码 使一个视频中的音频静音,只保留视频
ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
-f 指定输出格式 使用aac音频数据和H264的视频生成MP4文件
ffmpeg -i input.mp4 -r 0.25 frames_%04d.png
每4秒截取一帧视频生成一张图片,生成的图片从frames_0001.png开始递增
ffmpeg -i frames_%04d.png -r 5 output.gif
使用一组图片可以组成一个gif
ffmpeg -i test.avi -i frames_0004.jpeg -filter_complex overlay after.avi
给视频添加水印
ffmpeg -I test.avi -vf"drawtext=fontfile=simhei.ttf:text=‘雷’:x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" after.avi
添加文字水印
ffmpeg -i 1.ts -r 1 -f image2 result-image/image-%3d.jpeg
视频转图片
ffmpeg -i image%d.jpg out.mp4
ffmpeg -i image%d.jpg -pix_fmt yuv420p out.mp4
图片转视频(第一种不设参数,视频效果可能会很差,例如绿屏【在本地看是绿屏,但很神奇的一点是,从vx上发出去看效果是好的】)
我们从终端进入命令行,进入刚才存有图片的imgs文件夹下执行ffmpeg -i image%d.jpg -pix_fmt yuv420p output.mp4
命令,就可以看到组合好的视频了(见右下)。
说归说,骂归骂,中国队世预赛加油!