python怎么对对边录制的mp4文件取最后一帧图信息

python怎么对对边录制产生的mp4文件取最后一帧图信息,这个录制的mp4文件还在录制中会不断增加文件体积,我要做个边录制边取最后一帧数进行识别物品类似功能,并且要求取帧图要速度在1秒内,难倒在mp4取帧图的问题上了

示例代码如下,望采纳:

import cv2
 
video = cv2.VideoCapture("video.mp4")
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
video.set(cv2.CAP_PROP_POS_FRAMES, total_frames - 1)
ret, last_frame = video.read()
cv2.imshow("Last frame", last_frame)
cv2.waitKey(0)

video.release()

可以使用Python的OpenCV库来处理视频文件。

首先,需要安装OpenCV库,可以使用以下命令进行安装:

pip install opencv-python

然后,可以使用以下代码来获取视频文件的最后一帧图像:


import cv2

# 打开视频文件
video = cv2.VideoCapture("video.mp4")

# 获取视频总帧数
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

# 跳到最后一帧
video.set(cv2.CAP_PROP_POS_FRAMES, total_frames-1)

# 读取最后一帧
success, last_frame = video.read()

# 如果读取成功,显示图像
if success:
    cv2.imshow("Last frame", last_frame)
    cv2.waitKey(0)

# 释放资源
video.release()

上述代码每次读取最后一帧都会进行文件IO,如果要求1秒内读取最后一帧,可以考虑使用多线程或者多进程读取。

另外,对于文件在不断增加的情况,可以考虑使用边读边处理的方式,即在视频录制过程中定时获取最后一帧进行处理。

可以使用 OpenCV 的 cv2.VideoCapture() 函数打开视频文件,然后使用 cv2.CAP_PROP_FRAME_COUNT 属性来获取视频中帧的总数,再将 cv2.CAP_PROP_POS_FRAMES 设置为帧总数-1 获取最后一帧图像。

你可以用一个 while 循环来不断读取最新的帧并取出最后一帧。

下面是一个简单的例子:

import cv2

#打开视频文件
video = cv2.VideoCapture("your_video_file.mp4")

#获取视频总帧数
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

while True:
    #读取最新帧
    ret, frame = video.read()
    if not ret:
        break
    #获取最后一帧
    video.set(cv2.CAP_PROP_POS_FRAMES, total_frames-1)
    ret, last_frame = video.read()
    if not ret:
        break
    #显示最后一帧图片
    cv2.imshow("Last Frame", last_frame)
    cv2.waitKey(1000) #等待1s

    #释放资源
video.release()
cv2.destroyAllWindows()
    

直接使用录制时候的帧进行识别 到达一定结果数进行概率统计 投票 多的为正确的类别 会给分类的准确率提高,或者是隔几个帧进行识别
如果延迟大可以采取分布式异步处理。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

建议你使用OpenCV 库来读取视频文件并获取最后一帧图像。示例如下:

int LoadBitmap(const char *file)

{

unsigned int ID;      //纹理的id

int width,height;

byte *image;          //接受图像数据

FILE *fp;            //文件指针

BITMAPFILEHEADER FileHeader;    //接受位图文件头

BITMAPINFOHEADER InfoHeader;    //接受位图信息头

fp=fopen(file,"rb");

if (fp == NULL)

{

printf("Exception: Fail to open file!\n");

return -1;

}

fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

if(FileHeader.bfType != BITMAP_ID)  //确保文件是一个位图文件,效验文件类型

{

printf("Exception: This file is not a bmp file!\n");

fclose(fp);

return -1;

}

fread(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);

width=InfoHeader.biWidth;

height=InfoHeader.biHeight;

InfoHeader.biSizeImage = width*height*3;

fseek(fp, FileHeader.bfOffBits, SEEK_SET);  //将文件指针移动到实际图像数据处

image=(byte *)malloc(sizeof(byte)*InfoHeader.biSizeImage); //申请空间

if (image == NULL)

{

free(image);

printf("Exception: No enough space!\n");

return -1;

}

fread(image, 1, InfoHeader.biSizeImage, fp);

fclose(fp);

glGenTextures(1, &ID);

glBindTexture(GL_TEXTURE_2D, ID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width,

height, GL_BGR_EXT, GL_UNSIGNED_BYTE,

image);

return ID;

}

按照您的要求,python对边录制的mp4文件截取最后一帧的信息的问题,因为视频是正在录制写入mp4文件的,所以所谓的最后一帧,不就是要截取的那个时刻,视频当前的那一帧吗,所以你只要每隔1秒就去获取视频当前的那一帧frame,然后使用opencv里面的imwrite(imgfile_name,frame)即可。
如果你是要整个完整视频的最后一帧,就等视频录制完后,读取视频文件截取最后一帧即可(楼上的代码)

你的问题,是打开摄像头录制 mp4 文件,同时对最后一帧图像进行处理,例如识别,对吧?
例程如下,其中 userfunction(frame) 是你写的用户函数,对最后一帧(当前帧)frame 进行处理。

【例程0107】调用摄像头拍照和录制视频
本例程示例调用笔记本内置摄像头抓拍图片和录制视频。
注意根据计算机和摄像头的配置和接口的不同,可能需要修改API的设置。

# 【0107】调用摄像头拍照和录制视频
import cv2 as cv

if __name__ == '__main__':
    # 创建视频捕获对象,调用笔记本摄像头
    # cam = cv.VideoCapture(0)  # 创建捕获对象,0 为笔记本摄像头
    cam = cv.VideoCapture(0, cv.CAP_DSHOW)  # 修改 API 设置为视频输入 DirectShow

    # 设置写入视频图像的高,宽,帧速率和总帧数
    fps = 20  # 设置帧速率
    width = int(cam.get(cv.CAP_PROP_FRAME_WIDTH))  # 640
    height = int(cam.get(cv.CAP_PROP_FRAME_HEIGHT))  # 480
    fourcc = cv.VideoWriter_fourcc(*'XVID')  # 编码器设置 XVID
    # 创建写入视频对象
    vedioPath = "../images/camera.mp4"  # 写入视频文件的路径
    capWrite = cv.VideoWriter(vedioPath, fourcc, fps, (width, height))
    print(fourcc, fps, (width, height))

    sn = 0  # 抓拍图像编号
    while cam.isOpened():  # 检查视频捕获是否成功
        success, frame = cam.read()  # 读取下一帧视频图像
        if success is True:
            cv.imshow('vedio', frame)  # 播放视频图像
            capWrite.write(frame)  # 将当前帧写入视频文件
            userfunction(frame)  # 用户定义的函数,对最后一帧(当前帧)frame 进行处理
            key = cv.waitKey(1) & 0xFF  # 接收键盘输入
            if key == ord('c'):  # 按 'c' 键抓拍当前帧
                filePath = "../images/photo{:d}.png".format(sn)  # 保存文件名
                cv.imwrite(filePath, frame)  # 将当前帧保存为图片
                sn += 1  # 更新写入图像编号
                print(filePath)
            elif key == ord('q'):  # 按 'q' 键结束录制视频
                break
        else:
            print("Can't receive frame.")
            break

    cam.release()  # 关闭视频捕获对象
    capWrite.release()  # 关闭视频写入对象
    cv.destroyAllWindows()  # 关闭显示窗口

其实,应该进行抽帧处理,再对抽帧后的最后一帧图像进行处理,而不是对每一帧图像处理,否则速度跟不上。
参见:【youcans 的 OpenCV 例程 300篇】252. 视频文件的读取与保存(https://blog.csdn.net/youcans/article/details/125226884)

新年快乐🎉,望采纳,谢谢!
你可以尝试一下这个代码:

import cv2

# 读取视频文件
cap = cv2.VideoCapture('video.mp4')

# 获取视频帧数
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 跳转到最后一帧
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count - 1)

# 读取最后一帧图片
ret, frame = cap.read()

# 保存最后一帧图片
cv2.imwrite('last_frame.jpg', frame)

可以使用OpenCV库来实现这个功能。OpenCV提供了一个VideoCapture类,可以用来读取视频文件,并且可以设置读取的帧率。可以使用VideoCapture类的read()方法来读取视频文件中的每一帧,并且可以使用get()方法来获取视频文件的总帧数。最后,可以使用VideoCapture类的set()方法来设置读取的帧率,从而实现边录制边取最后一帧图片的功能。

你可以使用 Python 的 OpenCV 库来读取 mp4 文件并取出最后一帧图像。下面是一个示例代码:
import cv2

Open the video file

cap = cv2.VideoCapture('video.mp4')

Get the total number of frames in the video

total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

Set the video pointer to the last frame

cap.set(cv2.CAP_PROP_POS_FRAMES, total_frames - 1)

Read the last frame

ret, last_frame = cap.read()

Display the last frame

cv2.imshow("Last Frame", last_frame)
cv2.waitKey(0)

Release the video capture object

cap.release()

然而,这个代码会读取整个视频文件,如果视频文件很大的话,那么可能会很慢。如果您想要更快的速度,您可以考虑使用其他库如 moviepy 之类的,这些库可能会更快。

另外如果视频在录制中会不断增加文件体积,那么可以使用临时文件夹存储,每隔一段时间读取这个文件,并对这个文件进行识别,识别完成后删除。

望采纳!!

建议通过 openGL 的方式处理:

https://blog.csdn.net/weixin_39843078/article/details/110984277