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
cap = cv2.VideoCapture('video.mp4')
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
cap.set(cv2.CAP_PROP_POS_FRAMES, total_frames - 1)
ret, last_frame = cap.read()
cv2.imshow("Last Frame", last_frame)
cv2.waitKey(0)
cap.release()
然而,这个代码会读取整个视频文件,如果视频文件很大的话,那么可能会很慢。如果您想要更快的速度,您可以考虑使用其他库如 moviepy 之类的,这些库可能会更快。
另外如果视频在录制中会不断增加文件体积,那么可以使用临时文件夹存储,每隔一段时间读取这个文件,并对这个文件进行识别,识别完成后删除。
望采纳!!
建议通过 openGL 的方式处理:
https://blog.csdn.net/weixin_39843078/article/details/110984277