【Opencv】Pyhton 播放上一帧,下一帧,存video,逐帧分析

这篇具有很好参考价值的文章主要介绍了【Opencv】Pyhton 播放上一帧,下一帧,存video,逐帧分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读取具体哪一帧

这个方法可以获取某一帧:


while True:
    cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)
    ret, frame = cap.read()
    if not ret:
        break

等待按钮

这个方法可以显示当前帧,然后等待你的按钮:

        # 显示当前帧
        cv2.imshow('Video Frame', frame)
        # 等待按键输入
        key = cv2.waitKey(0)  # 使用较短的等待时间以确保视频正常播放
        if key == 27:  # ESC
            break
        elif key == ord('q'):  # Q 键(往回跳一帧)
            if current_frame > 0:
                current_frame -= 1
        elif key == ord('w'):  # W 键(往前播放一帧)
            if current_frame < len(json_data) - 1:
                current_frame += 1

这个标志打开可以让你存储一个mp4视频:

FLAG_SAVE_VIDEOS = False

写入解码方式与文件格式对应

不同的视频文件格式通常需要使用不同的编解码器,因此你需要根据你要创建的视频文件格式来选择合适的四字符编码标识。以下是一些常见的视频文件格式和相应的四字符编码标识示例:

  1. H.264 编码(通常用于.mp4文件):

    fourcc = cv2.VideoWriter_fourcc(*'H264')
    
  2. XVID 编码(通常用于.avi文件):

    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    
  3. MJPG 编码(通常用于.avi文件,适用于每帧图像质量高的场景):

    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    
  4. DIVX 编码(通常用于.avi文件):

    fourcc = cv2.VideoWriter_fourcc(*'DIVX')
    
  5. VP8 编码(通常用于.webm文件):

    fourcc = cv2.VideoWriter_fourcc(*'VP80')
    
  6. VP9 编码(通常用于.webm文件):

    fourcc = cv2.VideoWriter_fourcc(*'VP90')
    

这些是一些常见的视频文件格式和相应的四字符编码标识示例。根据你的需求和所使用的视频文件格式,选择适合的编码标识以确保视频文件可以正确编码和解码。不同的视频编辑软件和播放器也支持不同的编解码器,因此你可能需要根据最终使用情况进行调整。文章来源地址https://www.toymoban.com/news/detail-700426.html

全部代码

import logging
import time

import cv2
import json

# 读取JSON文件
with open('../inoutdir/long.json', 'r') as f:
    json_data = json.load(f)

# 打开视频文件
cap = cv2.VideoCapture('../inoutdir/long.mp4')

current_frame = 0
# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s [Frame %(frame)d / %(frame_all)d] %(message)s')
logger = logging.getLogger()

FLAG_SAVE_VIDEOS = False
if FLAG_SAVE_VIDEOS:
    output_file = '../output/long_draw.mp4'
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    frame_width = int(cap.get(3))
    frame_height = int(cap.get(4))
    out = cv2.VideoWriter(output_file, fourcc, 30, (frame_width, frame_height))

# 初始化时间统计
start_time = time.time()
total_frames = len(json_data)

while True:
    cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)
    ret, frame = cap.read()
    if not ret:
        break
    # 记录时间戳
    frame_timestamp = time.time()

    # 从JSON中获取当前帧的检测结果
    if current_frame < len(json_data):
        detections = json_data[current_frame]['dets']

        # 在每个检测上绘制边界框
        for det in detections:
            x1, y1, x2, y2, score, class_id = det
            color = (0, 255, 0)  # 绿色边界框
            label = f'{int(class_id)},{score:.2f}'
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), color, 2)

            # 计算文本位置以确保在框内
            text_x = int(x1)
            text_y = int(y1) - 10
            if text_y - 10 < 0:
                text_y = int(y1) + 20  # 如果文本位置超出了帧的上边界,则将其放在边界框的下方

            cv2.putText(frame, label, (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

    if FLAG_SAVE_VIDEOS:
        out.write(frame)  # 将当前帧写入输出视频
        current_frame += 1
    else:
        # 显示当前帧
        cv2.imshow('Video Frame', frame)
        # 等待按键输入
        key = cv2.waitKey(0)  # 使用较短的等待时间以确保视频正常播放
        if key == 27:  # ESC
            break
        elif key == ord('q'):  # Q 键(往回跳一帧)
            if current_frame > 0:
                current_frame -= 1
        elif key == ord('w'):  # W 键(往前播放一帧)
            if current_frame < len(json_data) - 1:
                current_frame += 1
    # 计算每一帧消耗的时间并记录到日志中
    frame_processing_time = time.time() - frame_timestamp
    logger.info(f'Frame processed in {frame_processing_time:.4f} seconds',extra={'frame': current_frame, 'frame_all': total_frames})

# 计算总共消耗的时间
total_processing_time = time.time() - start_time
average_frame_time = total_processing_time / total_frames if total_frames > 0 else 0

print(total_processing_time)
print(average_frame_time)

# 释放视频文件、关闭窗口和输出视频文件
cap.release()
if FLAG_SAVE_VIDEOS:
    out.release()
cv2.destroyAllWindows()

到了这里,关于【Opencv】Pyhton 播放上一帧,下一帧,存video,逐帧分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包