在开始修改视频中的帧之前,我试图获得一个复制视频的非常简单的示例。但是,与 2.8 mb Barriers.avi 视频相比,output.avi 视频是一个 5kb 的损坏文件。我使用的是 OpenCV 版本 4.2.0 和 Python 版本 3.7.7。
这是代码:
import cv2
input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi', fourcc, 30, (height, width), isColor=True)
while input.isOpened():
# get validity boolean and current frame
ret, frame = input.read()
# if valid tag is false, loop back to start
if not ret:
break
else:
out.write(frame)
input.release()
out.release()
Run Code Online (Sandbox Code Playgroud)
如果我打印框架形状,我会得到:
(480, 640, 3)
Run Code Online (Sandbox Code Playgroud)
注意:其他堆栈溢出解决方案都没有帮助。
编辑:如果使用 cv2.imshow(),所有帧都显示良好。
我正在 python 中使用 Opencv 处理视频并使用 tqdm 显示进度条。然而,进展超过了100%。不太确定为什么会发生这种情况。
我是 opencv 的新手,所以我可能会传递错误的参数来执行我的意图。
我尝试了几种方法。将它们列出来。
cam = cv2.VideoCapture("path")
fps = cam.get(cv2.CAP_PROP_FPS)
total_frame_count = int(cam.get(cv2.CAP_PROP_FRAME_COUNT))
length = total_frame_count/fps
pbar = tqdm(total = total_frame_count)
count = 0
while(True):
ret,frame = cam.read()
pbar.update(count)
# process(frame)
count += fps*5
cam.set(cv2.CAP_PROP_POS_FRAMES, count)
Run Code Online (Sandbox Code Playgroud)
我有一个叫做的计数器count,基本上是跳过视频 5 秒。
我有一个视频,我想从视频中仅提取特定的帧。
目前我所做的是:
index = [1,2,3,4,5,6,7,8]
img_list = []
for i, frame in enumerate(iio.imiter("imageio:cockatoo.mp4")):
if i in index:
img_list.append(frame)
img_array = np.asarray(img_list)
Run Code Online (Sandbox Code Playgroud)
有没有办法只“寻找”我想要的帧,就像在 opencv 中完成的那样,如此处所示?
我正在尝试制作 5 秒视频的慢动作。为了保持相同的帧速率,我需要更多的帧。我从视频中提取了所有帧,并通过创建新帧将它们的数量加倍。每个帧都与其后继帧相结合,创建一个平均帧以插入它们之间。
average = (predecessor + successor)/2
Run Code Online (Sandbox Code Playgroud)
结果在空间上是正确的,但在颜色方面却不正确。平均图像比原始图像明显暗。我正在尝试放慢费德勒打网球的视频速度。平均图像在原始图像与其后继图像之间找到了中间地带。这种效果可以在球员和球明显移动的帧之间看到。下图显示了我试图消除的颜色差异(左:平均,右:原始)
为什么会出现这种情况?有没有更好的方法来实现我想要做的事情?
我需要获取图像作为用户加载的视频的预览,它不需要是一个很棒的缩略图,因为它只是用于聊天应用程序,所以我想到当用户发送包含 mp4 的消息时我处理它并保存一个随机帧。
我用谷歌搜索了一下,每个人都在使用 ffmpeg,但这是一个外部软件,你只能用 java 与它交互,我的项目需要独立,我不希望它依赖于服务器安装了 ffmpeg 的事实,所以我回到过去并找到了 JavaFX,但所有在线片段都没有指定他们正在使用的版本,而且 chatGPT 一如既往地毫无用处,你们能告诉我如何做到这一点,或者至少向我解释一下它是如何工作的吗?我可以自己编码吗?我正在使用这个依赖项
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>16</version> <!-- the version chatGPT wrote but you can change that -->
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果您有完全不同的解决方案,那也很棒,我只关心在指定路径上使用指定名称保存视频中的随机帧,提前致谢
我尝试了这种方法,但它给出了很多错误,可能是因为版本不匹配
private byte[] getFrameFromVideo(String videoFilePath, int targetTimeSeconds) throws IOException {
try {
Media media = new Media(new File(videoFilePath).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
CountDownLatch latch = new CountDownLatch(1);
mediaPlayer.setOnReady(() -> {
mediaPlayer.pause();
mediaPlayer.setStartTime(mediaPlayer.getTotalDuration().multiply(targetTimeSeconds * 1.0 / media.getDuration().toSeconds()));
mediaPlayer.setStopTime(mediaPlayer.getStartTime().add(mediaPlayer.getTotalDuration().multiply(1.0 / media.getDuration().toSeconds())));
latch.countDown();
});
mediaPlayer.setOnEndOfMedia(() -> {
BufferedImage bufferedImage = new BufferedImage(mediaPlayer.getMedia().getWidth(), mediaPlayer.getMedia().getHeight(), …Run Code Online (Sandbox Code Playgroud) 例如,有QR扫描仪实时扫描视频流并获得QR码信息.我想检查视频中的光源,如果它打开或关闭,它是非常强大的,所以它没有问题.
我可能会将视频流作为输入,可能会制作图像并分析图像或实时流式传输光源(可能是图像上某些颜色的像素数?)
我该如何处理这个问题?也许有一些图书馆的来源?
我正在使用OpenCV处理一些用户将手放在墙壁不同部分的视频.我选择了一些感兴趣的区域,我目前正在使用cv2.absdiff墙上的原始图像,没有用户和当前帧,通过查看平均像素差异来检测用户是否将手放在感兴趣的区域中.如果它高于某个阈值,我认为该区域"已激活".
我遇到的问题是某些视频剪辑包含照明和位置,导致用户在某些ROI上投下阴影,使得它们高于阈值.是否有一种很好的方法可以在分辨图像时滤除阴影?
我使用HM-12.0参考代码创建了一个基本的bin流.因此输出是HEVC编码的bin流(比如input.bin).
我有一个任务涉及读取这个基本流的标题.那就是我需要从input.bin文件中获取诸如流宽度,高度等信息.
看到很多流后,我可以得出结论,所有这些bin流都是从序列开始的:
00 00 00 01
Run Code Online (Sandbox Code Playgroud)
因此,每当我在任何bin流中看到此序列时,我可以说该流必须由HEVC解码器解码.
此外,如果我想从input.bin获取宽度,高度,fps等(如ffmpeg中的ff_raw_video_read_header函数),那么需要执行哪些步骤来获取此信息?
我已经完成了HEVC草案的解析部分,但它对于我在视频领域的水平非常复杂.任何人都可以建议一种从编码的bin文件中获取所需信息的简单方法吗?
任何建议对我都很有帮助.提前致谢.
我有以下代码,可以找到2个图像(或2个视频帧)的光流,并且它是彩色编码的.我想要的是光流的水平和垂直分量(如单独的图像)
这是我到目前为止的代码:
import cv2
import numpy as np
frame1 = cv2.imread('my1.bmp')
frame2 = cv2.imread('my2.bmp')
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
while(1):
next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prvs, next, 0.5, 3, 15, 3, 5, 1.2, 0)
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
hsv[...,0] = ang*180/np.pi/2
hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
cv2.imshow('frame2',rgb)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
elif k == ord('s'):
cv2.imwrite('opticalmyhsv.pgm',rgb)
cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
鉴于我的两张图片,这就是光流的样子:

我正在尝试大致了解视频编解码器的工作原理,其中之一是H.264。
我在网络上浏览了一些有关该工具工作原理的文章,H.264希望对此有所了解。
在阅读相同的内容的时候,我知道了不同类型的帧,例如I-Frame,P-Frame和B-Frame,在流式传输使用H.264。
我无法理解的是,给了一个原始视频,其中显然有帧的数据,网络上的文献说这I-Frame是原始帧,因为它是P-Frame从先前的I-Frame或预测的位置P-Frame,在这里如何P-Frame预测P-Frame当另一个还不存在时。
同样使我困惑的是对P-Frame。
请帮助理解相同内容或参考解释相同内容的文献。