文章目录
场景
需求:视频检测项目遇到要将检测视频和检测结果弹窗进行合并放在一个视频文件内,且要求不能太大。
提示:以下是本篇文章正文内容,下面案例可供参考
一、视频文件横向合并
准备两个视频文件,格式尽量一样,我的视频文件分别是im.avi和bg.avi,直接上代码。
import cv2
import numpy as np
INPUT_FILE1 = 'im.avi'
INPUT_FILE2 = 'bg.avi'
OUTPUT_FILE = 'merge.avi'
reader1 = cv2.VideoCapture(INPUT_FILE1)
reader2 = cv2.VideoCapture(INPUT_FILE2)
width = int(reader1.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(reader1.get(cv2.CAP_PROP_FRAME_HEIGHT))
writer = cv2.VideoWriter(OUTPUT_FILE,
cv2.VideoWriter_fourcc('I', '4', '2', '0'),
30, # fps
(width, height//2)) # resolution
print(reader1.isOpened())
print(reader2.isOpened())
have_more_frame = True
c = 0
while have_more_frame:
have_more_frame, frame1 = reader1.read()
_, frame2 = reader2.read()
frame1 = cv2.resize(frame1, (width//2, height//2))
frame2 = cv2.resize(frame2, (width//2, height//2))
img = np.hstack((frame1, frame2))
cv2.waitKey(1)
writer.write(img)
c += 1
print(str(c) + ' is ok')
writer.release()
reader.release()
cv2.destroyAllWindows()
合并结果:
二、视频压缩
通过第一步实现了视频的横向合并,但合并的后的AVI文件有300多兆,不适合传输,所以要对视频压缩,代码如下:
#capture=cv2.VideoCapture('/home/conda_work/conda_hsz/yolov4-keras-master_hat//v_video/in_put/170410000003040100001502020112514032220201125140458.mp4')
import cv2
capture=cv2.VideoCapture("merge.avi")
if not capture.isOpened():
raise IOError("Couldn't open webcam or video")
video_FourCC = int(capture.get(cv2.CAP_PROP_FOURCC)) #获取解码器
video_fps = capture.get(cv2.CAP_PROP_FPS) #获取帧速率
video_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc('M','P','4','2') # output video codec
fourcc_mp4=cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter("/home/conda_work/conda_hsz/r1.mp4", fourcc_mp4, video_fps, video_size) #创建保存视频对象
while(True):
# 读取某一帧
ref,frame=capture.read()
# 格式转变,BGRtoRGB
if not ref:
break
# frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
# # 转变成Image
# frame = Image.fromarray(np.uint8(frame))
# # RGBtoBGR满足opencv显示格式
# frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
# frame = cv2.putText(frame, "fps= %.2f"%(fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.namedWindow("video",cv2.WINDOW_FREERATIO)
cv2.namedWindow("video",cv2.WINDOW_AUTOSIZE)
cv2.imshow("video",frame)
out.write(frame) #保存视频
if cv2.waitKey(10) & 0xFF == ord('q'):
break
capture.release()
out.release()
cv2.destroyAllWindows()
压缩后,视频文件有原来的375M缩小至10.1M。