标签: video-processing

OpenCV Python VideoWriter 保存损坏的视频

在开始修改视频中的帧之前,我试图获得一个复制视频的非常简单的示例。但是,与 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 save video-processing

3
推荐指数
1
解决办法
4517
查看次数

opencv 视频采集的 tqdm 进度条超过 100%

我正在 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 秒。

python opencv video-capture video-processing tqdm

3
推荐指数
1
解决办法
1299
查看次数

如何使用“imageio”在视频中查找帧?

我有一个视频,我想从视频中仅提取特定的帧。

目前我所做的是:

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 中完成的那样,如此处所示

python opencv video-processing python-imageio

3
推荐指数
1
解决办法
1961
查看次数

图像之间的平均值会产生较暗的图像

我正在尝试制作 5 秒视频的慢动作。为了保持相同的帧速率,我需要更多的帧。我从视频中提取了所有帧,并通过创建新帧将它们的数量加倍。每个帧都与其后继帧相结合,创建一个平均帧以插入它们之间。

average = (predecessor + successor)/2
Run Code Online (Sandbox Code Playgroud)

结果在空间上是正确的,但在颜色方面却不正确。平均图像比原始图像明显暗。我正在尝试放慢费德勒打网球的视频速度。平均图像在原始图像与其后继图像之间找到了中间地带。这种效果可以在球员和球明显移动的帧之间看到。下图显示了我试图消除的颜色差异(:平均,:原始)

在此输入图像描述前任(原版)

为什么会出现这种情况?有没有更好的方法来实现我想要做的事情?

matlab average image-processing video-processing

3
推荐指数
1
解决办法
75
查看次数

java 如何从 .mp4 视频中获取图像?

我需要获取图像作为用户加载的视频的预览,它不需要是一个很棒的缩略图,因为它只是用于聊天应用程序,所以我想到当用户发送包含 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)

java javafx video-processing

3
推荐指数
1
解决办法
183
查看次数

如何在iOS上分析视频流?

例如,有QR扫描仪实时扫描视频流并获得QR码信息.我想检查视频中的光源,如果它打开或关闭,它是非常强大的,所以它没有问题.

我可能会将视频流作为输入,可能会制作图像并分析图像或实时流式传输光源(可能是图像上某些颜色的像素数?)

我该如何处理这个问题?也许有一些图书馆的来源?

video opencv objective-c video-processing ios

2
推荐指数
1
解决办法
3362
查看次数

在opencv中区分帧时过滤掉阴影

我正在使用OpenCV处理一些用户将手放在墙壁不同部分的视频.我选择了一些感兴趣的区域,我目前正在使用cv2.absdiff墙上的原始图像,没有用户和当前帧,通过查看平均像素差异来检测用户是否将手放在感兴趣的区域中.如果它高于某个阈值,我认为该区域"已激活".

我遇到的问题是某些视频剪辑包含照明和位置,导致用户在某些ROI上投下阴影,使得它们高于阈值.是否有一种很好的方法可以在分辨图像时滤除阴影?

opencv image-processing video-processing computer-vision

2
推荐指数
1
解决办法
1504
查看次数

HEVC:从输入bin流中获取输入宽度和高度

我使用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文件中获取所需信息的简单方法吗?

任何建议对我都很有帮助.提前致谢.

video ffmpeg video-processing h.265 hevc

2
推荐指数
1
解决办法
1952
查看次数

使用OpenCV的光流 - 水平和垂直组件

我有以下代码,可以找到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)

鉴于我的两张图片,这就是光流的样子:

python opencv image-processing video-processing opticalflow

2
推荐指数
1
解决办法
1万
查看次数

处理原始视频时,如何用H.264编解码器构造P帧

我正在尝试大致了解视频编解码器的工作原理,其中之一是H.264

我在网络上浏览了一些有关该工具工作原理的文章,H.264希望对此有所了解。

在阅读相同的内容的时候,我知道了不同类型的帧,例如I-FrameP-FrameB-Frame,在流式传输使用H.264

我无法理解的是,给了一个原始视频,其中显然有帧的数据,网络上的文献说这I-Frame是原始帧,因为它是P-Frame从先前的I-Frame或预测的位置P-Frame,在这里如何P-Frame预测P-Frame当另一个还不存在时。

同样使我困惑的是对P-Frame

请帮助理解相同内容或参考解释相同内容的文献。

video encoding video-processing video-streaming h.264

2
推荐指数
1
解决办法
1057
查看次数