大家好,我是烤鸭:
最近在尝试做视频卡顿分析,对python不是特别了解。以前也没感觉GPT有能好用,这次用了一下,真的是有点牛了,起码可以节省半天的工作量。使用的是百度AI-文心一言,感觉还是比较好用的。
卡顿分析的方式
尽量模拟肉眼感观,通过对比不同帧画面,来确认是否有卡顿出现,直接问AI吧。
不够直观的话,再加个框框。
第一版代码:
import cv2
# 打开视频文件
cap = cv2.VideoCapture('video.mp4')
# 逐帧读取视频
while cap.isOpened():
ret, frame = cap.read()
# 如果读取到帧,则进行比较
if ret:
# 比较当前帧与前一帧的差异
diff = cv2.absdiff(frame, prev_frame)
# 设定差异阈值
threshold = 100
# 如果差异小于阈值,认为没有卡顿
if cv2.countNonZero(diff) < threshold:
# 统计没有卡顿的帧数,并在当前帧周围添加绿色外框
non_jerky_frames += 1
cv2.rectangle(frame, (0, 0), (frame.shape[1] - 1, frame.shape[0] - 1), (0, 255, 0), 2)
else:
# 否则认为有卡顿,并在当前帧周围添加红色外框
jerky_frames += 1
cv2.rectangle(frame, (0, 0), (frame.shape[1] - 1, frame.shape[0] - 1), (0, 0, 255), 2)
# 将当前帧保存为前一帧,用于下一次比较
prev_frame = frame.copy()
# 读取下一帧
else:
break
# 关闭视频文件,显示结果和添加外框的视频帧
cap.release()
cv2.imshow('Video Frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 计算卡顿率
jerky_rate = jerky_frames / (jerky_frames + non_jerky_frames) * 100
print('卡顿率为:', jerky_rate, '%')
变量没有定义,也可以自动修正。
完整代码
import cv2
import time
def videoCap(url, frame_series_count):
# 打开视频文件
cap = cv2.VideoCapture(url)
frame_rate = cap.get(cv2.CAP_PROP_FPS)
if frame_rate > 100:
frame_rate = 30
else:
frame_rate = 60
print("frame_rate", frame_rate)
non_jerky_frames = 0
jerky_frames = 0
prev_frame = 0
# 逐帧读取视频
while cap.isOpened():
ret, frame = cap.read()
# 如果读取到帧,则进行比较
if ret:
gray_roi_list = []
# 将指定区域转换为灰度图像
gray_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray_roi_list.append(gray_roi)
# 比较当前帧与前一帧的差异
diff = cv2.absdiff(frame, prev_frame)
scaled_abs_diff = cv2.normalize(diff, None, 0, 255, cv2.NORM_MINMAX)
# 设定差异阈值
threshold = 1.5
diff_intensity = 0.0
print(diff.mean())
# 如果差异大于阈值,认为没有卡顿
if scaled_abs_diff.mean() > threshold:
# 统计没有卡顿的帧数,并在当前帧周围添加绿色外框
non_jerky_frames += 1
cv2.rectangle(frame, (0, 0), (frame.shape[1] - 1, frame.shape[0] - 1), (0, 255, 0), 2)
else:
# 否则认为有卡顿,并在当前帧周围添加红色外框
jerky_frames += 1
cv2.rectangle(frame, (0, 0), (frame.shape[1] - 1, frame.shape[0] - 1), (0, 0, 255), 2)
# 将当前帧保存为前一帧,用于下一次比较
prev_frame = frame.copy()
# 关闭视频文件,显示结果和添加外框的视频帧
cv2.imshow('Video Frame', frame)
if cv2.waitKey(frame_rate) & 0xFF == ord('q'):
break
# 读取下一帧
else:
break
cap.release()
cv2.destroyAllWindows()
# 计算卡顿率
jerky_rate = jerky_frames / (jerky_frames + non_jerky_frames) * 100
print('卡顿率为:', jerky_rate, '%')
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
videoCap('C:\\Users\\xxxx\\Desktop\\xxxc\\test\\1.mkv', 1)
实现的效果就是对比当前画面帧是否有变化,如果有不动的话就加个红框(认为是卡顿)。
效果演示
文章参考
https://blog.csdn.net/cangqiongxiaoye/article/details/126334385
https://www.cnblogs.com/Tdazheng/p/13608737.html
https://blog.csdn.net/juzicode00/article/details/120934559
https://blog.csdn.net/weixin_54977011/article/details/120208280