Python OpenCV 2.4 写入半完整的PNG视频帧

2023-12-08

我刚刚在 Ubuntu 12.04 上从源代码安装了 OpenCV 2.4。我正在尝试使用 Python 脚本将视频的第一帧写入 PNG 图像,但我得到了一些奇怪的结果。这是代码:

import numpy as np
import cv
import cv2
import sys

video = cv.CaptureFromFile(sys.argv[1])
frame = cv.QueryFrame(video)
proxy = cv.CreateImage(cv.GetSize(frame), 8, 1)
cv.CvtColor(frame, proxy, cv.CV_BGR2GRAY)
a = np.asarray(cv.GetMat(proxy))
cv2.imwrite('image.png', a)

问题是,图像看起来像这样:

half complete something or other

这些是 AVI 文件,其他方面似乎都很好。有任何想法吗?

Edit #1:抱歉,这是 ffmpeg 版本信息:

ffmpeg version 0.10.2-4:0.10.2-0ubuntu0jon1
built on Mar 18 2012 09:59:38 with gcc 4.6.3
configuration: --extra-version='4:0.10.2-0ubuntu0jon1' --arch=amd64 --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu --disable-stripping --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-libfreetype --enable-vaapi --enable-frei0r --enable-gpl --enable-postproc --enable-x11grab --enable-librtmp --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
libavutil      51. 35.100 / 51. 35.100
libavcodec     53. 61.100 / 53. 61.100
libavformat    53. 32.100 / 53. 32.100
libavdevice    53.  4.100 / 53.  4.100
libavfilter     2. 61.100 /  2. 61.100
libswscale      2.  1.100 /  2.  1.100
libswresample   0.  6.100 /  0.  6.100
libpostproc    52.  0.100 / 52.  0.100

Edit #2:在我自己的故障排除中,我将 ffmpeg 从默认的 12.04 ubuntu 版本升级到您在上面的编辑 #1 中看到的版本。这似乎改变了一些事情:在这个问题中生成帧的视频现在似乎工作正常,但较大的视频仍然存在损坏的下半部分(或下三分之一或第四部分)。即使更大的视频实际上也会完全出现段错误。我不太确定该怎么做,除了——再一次——错误或丢失的编解码器。它的段错误就在QueryFrame step.

Edit #3:我更改了代码以专门使用 cv2 接口(根据下面评论之一中的链接)。现在,video.retrieve()总是返回False并且没有写任何图像。

Edit #4:在使用新的 cv2 接口读取视频帧之前,我对视频运行了以下命令:

ffmpeg -sameq -i normal.avi p_normal.avi

该命令的输出看起来不错,除了 ffmpeg 初始化及其输入描述后面的这一行:

编解码器“mpeg4”不兼容的像素格式“pal8”,自动选择 格式“yuv420p”

以下是该命令的完整输出:

Input #0, avi, from 'normal.avi':
  Duration: 00:01:37.60, start: 0.000000, bitrate: 1312 kb/s
    Stream #0:0: Video: rawvideo, pal8, 128x256, 5 tbr, 5 tbn, 5 tbc
Incompatible pixel format 'pal8' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x11a0f80] w:128 h:256 pixfmt:pal8 tb:1/1000000 sar:0/1 sws_param:
[buffersink @ 0x11a1380] auto-inserting filter 'auto-inserted scale 0' between the filter 'src' and the filter 'out'
[scale @ 0x1197da0] w:128 h:256 fmt:pal8 -> w:128 h:256 fmt:yuv420p flags:0x4
Output #0, avi, to 'p_normal.avi':
  Metadata:
    ISFT            : Lavf53.32.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 128x256, q=2-31, 200 kb/s, 5 tbn, 5 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo -> mpeg4)
Press [q] to stop, [?] for help
frame=  488 fps=  0 q=0.0 Lsize=    1497kB time=00:01:37.60 bitrate= 125.6kbits/s    
video:1480kB audio:0kB global headers:0kB muxing overhead 1.165352%

最重要的是,读取帧的 Python OpenCV 代码(使用 cv2 接口)仍然返回 False(与之前的行为相同)。

Edit #5:到目前为止我已按照说明进行操作在这里找到从源代码安装 ffmpeg 及其依赖项,一切都很顺利。在不从源代码重新安装 OpenCV 的情况下,我仍然遇到与以前相同的问题video.retrieve()返回 False。在尝试从源代码重新编译 OpenCV 2.4 时,我在编译过程中收到以下错误:

Linking CXX shared library ../../lib/libopencv_highgui.so
/usr/bin/ld: /usr/local/lib/libavcodec.a(avpacket.o): relocation R_X86_64_32S against `av_destruct_packet' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value

如果我使用以下命令重新编译 x264、libvpx 和 ffmpeg--enable-picflag,OpenCV编译仍然失败,这次用(kdbwin.o, .rodata) 代替 (avpacket.o, av_destruct_packet)分别在上面的代码片段中。

Edit #6:通过添加修复了上述错误--enable-sharedlibvpx 和 ffmpeg 的配置选项。 OpenCV 重新编译并成功构建,并且 ffmpeg 工作得很好。遗憾的是,运行上一个命令后(ffmpeg -sameq -i normal.avi p_normal.avi),我的脚本仍然无法检索任何帧;返回的标志仍然是 False。还有其他想法吗?

Edit #7:这是我正在使用的最新脚本。

import numpy as np
import cv2
import sys

video = cv2.VideoCapture(sys.argv[1])
flag, frame = video.retrieve()
if not flag:
  print 'Error'
  quit()
proxy = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imwrite('image.png', proxy)

Edit #8:知道了!代码应该是这样的:

import numpy as np
import cv2
import sys

video = cv2.VideoCapture(sys.argv[1])
if video.grab():
  flag, frame = video.retrieve()
  if not flag:
    print 'Error'
    quit()
  proxy = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  cv2.imwrite('image.png', proxy)

最有可能的问题是 ffmpeg 和使用的视频编解码器。您能分享其中一个视频吗?然后我们可以检查编解码器,看看出了什么问题。另外,我们不知道您的系统上有什么 ffmpeg 版本。

顺便说明一下,为什么要混合使用 cv 和 cv2 接口?仅使用 cv2 接口,代码看起来会更好。

Edit:我忘了提,我测试了代码,所以问题肯定不在代码中。

Edit 2:问题很可能是 ffmpeg 无法处理您的视频。如果没有测试相关视频,就很难说。你可以尝试一下cv2接口,cv2.VideoCapture是您应该用来从视频文件中抓取帧的工具。

Edit 3:我看了视频,看来 OpenCV 使用 ffmpeg 的方式对你的视频有问题。一个快速的解决方法是在由 OpenCV 打开之前使用 ffmpeg 处理视频。ffmpeg -sameq -i normal.avi p_norma.avi给你一个视频,p_norma.avi,您可以通过 OpenCV 毫无问题地处理它。为了normal.avi:

Selected video codec: [rawbgr8flip] vfm: raw (RAW BGR8)

对于生成的视频p_norma.avi:

Selected video codec: [ffodivx] vfm: ffmpeg (FFmpeg MPEG-4)

因此,生成的视频大约小 10 倍。这对你来说是一个可能的解决方案吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python OpenCV 2.4 写入半完整的PNG视频帧 的相关文章

  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • AVAssetExportSession 输出文件

    AVAssetExportSession 输出文件应该是什么样子 我正在尝试压缩 ALAsset 项目中的视频 但它不起作用 我猜输出文件与它有关 这是我正在使用的代码 NSString destinationPath NSHomeDire
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • 将一个时间序列插入到 pandas 中的另一个时间序列中

    我有一组定期测量的值 说 import pandas as pd import numpy as np rng pd date range 2013 01 01 periods 12 freq H data pd Series np ran
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 如何为多组精灵创建随机位置?

    我尝试使用 blit 和 draw 方法进行 for 循环 并为 PlayerSprite 和 Treegroup 使用不同的变量 for PlayerSprite in Treegroup surface blit PlayerSprit
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • flex/lex 中字符串文字的正则表达式

    我正在尝试学习 flex 并希望匹配字符串文字 我的代码目前如下所示 n n matches string literal 我已经在一个小时左右的时间里与各种变化作斗争 但无法让它按应有的方式工作 我本质上希望匹配一个不能包含换行符 除非它
  • windows mp3解码库c c++ [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我花了一整天的时间在这上面 这让我发疯 有人知道将 mp3 解码为简单 16 位 pcm
  • 在 VB.NET 中使用 LINQ 从数据表填充列表(字符串)

    所以我有一个看起来或多或少像的数据表 Column 0 Column 1 Something Something Else Another Thing Another Something Else 我想将第 0 列中的所有内容放入 List
  • R 如何检查 XPath 是否存在

    希望比我更有知识的人可以在这里提供一些启发 作为更大的网络爬虫的一部分 我想从一组页面中提取元数据 当我运行这个程序时 它失败了 调查显示这是由于所请求的 Xpath 之一不存在 我可以看到一个潜在的解决方案是将页面的所有元数据抓取到一个向
  • 如何 pip 安装具有最小和最大版本范围的软件包?

    我想知道是否有任何方法可以告诉 pip 特别是在需求文件中 安装具有最低版本的软件包 pip install package gt 0 2 和永远不应该安装的最高版本 理论API pip install package lt 0 3 我问这
  • if-let 语句的语法是什么?

    我在一些示例代码中遇到了这个片段 它工作正常 但我收到一个 linter 错误 指出它应该构造为 if let 语句 match event glutin Event WindowEvent event gt match event glu
  • 循环遍历工作表删除重复项

    我的代码似乎有效 我想检查是否有改进 潜在的错误和意外的后果 我的电子表格包含重复信息 有些电子表格每个文件中有 100 张表格 我不想使用删除重复信息手动浏览每张表 经过搜索我想我有一个解决方案 Sub RemoveDuplicates
  • 在 Android 2.3 上实现 OBEX PUSH 服务器

    我需要在 Android 2 3 设备上设置应用内 OBEX 服务器 使用蓝牙聊天示例代码 我能够设置 OBEX 服务器 但是 服务器需要使用自定义 UUID 因此该服务不会注册为 OBEX 服务器 sdptool browse local
  • 如何创建新文件夹来下载文件

    我想下载客户端 浏览器 制作的文件夹 我考虑过使用File API 但我找不到如何制作文件夹 例如 一些从html canvas制作的png放置一个文件夹 我想用下载对话框保存这个文件夹 我想将某个文件使用一个文件夹到一个文件夹中 并且我必
  • 需要拉取2个节点并合并LibXML中的信息

    我有一个问题 我肯定需要一些帮助 首先 要温柔 我对 perl 和 LibXML 都很陌生 我一直在解析文档并将元素放入数组中 然后将其写入电子表格列 在测试过程中发现某些节点有多个同名的子节点 我需要将每个子节点的文本合并到数组的一个元素
  • 默认情况下,当 hta 设置为以记事本打开时,CreateTextFile 不起作用(javascript)

    当我尝试使用 javascript 和 hta 文件创建文本文件时 我遇到了这个非常奇怪的问题 这是分解为基础的代码
  • 使用 MatPlotLib 绘制连续数据流

    我想使用 MatPlotLib 绘制图表 其中图表随时间变化 在每个时间步长 都会将额外的数据点添加到图中 然而 应该只显示一张图表 其外观会随着时间的推移而变化 在我的测试示例中 该图是一个简单的线性图 y x 这是我尝试过的 for i
  • htaccess - 在这种情况下不要重写

    我的访问文件如下所示 RewriteEngine On RewriteCond REQUEST FILENAME s OR RewriteCond REQUEST FILENAME l OR RewriteCond REQUEST FILE
  • 列表为类属性

    我不完全理解 以下示例中类属性整数或列表的区别是什么 class MyClass object a 1 b 1 def init self print self a id MyClass a print self b id MyClass
  • Bash 脚本获取其完整路径(使用“source”来调用它)

    在bash脚本中 有什么方法可以获取其自身的完整路径吗 source dev setup sh 我尝试过 0 但都无关紧要 提前致谢 The 源脚本位置的变量 如果您正在获取脚本 则可以使用以下命令访问脚本名称 since 0将是 bash
  • Z3统计:时间衡量什么?

    当使用 st 命令选项运行 Z3 3 1 时 我得到了奇怪的统计结果 如果按 Ctrl C Z3 会报告total time time 总时间 和 时间 衡量什么 这是一个错误 虽然很小 上面描述的差异 Thanks 这是 Z3 for L
  • Android - 无法使用traceview

    我正在尝试使用 Traceview 对 Android 应用程序运行一些分析 我用以下几行包装了我想要跟踪的代码 Debug startMethodTracing xxx code Debug stopMethodTracing 它成功生成
  • 开发者 Chrome 扩展程序:包无效。详细信息:“无法 uzip 扩展”

    我开发了一个 chrome 扩展 我做了一些小更新 突然无法通过 Chrome 网上商店安装扩展程序 我收到错误 Package is in valid Details Could not unzip extension zip 文件似乎有
  • `imshow(someImage, [])` 有什么作用?

    我试图找出第二个 空向量 参数imshow someImage 在Matlab中是为 根据doc imshow 它要么是颜色图 要么是宽度 高度范围 但这些对我来说都没有意义 因为向量是空的 使用空括号 imshow 将显示最小值和最大值之
  • Python OpenCV 2.4 写入半完整的PNG视频帧

    我刚刚在 Ubuntu 12 04 上从源代码安装了 OpenCV 2 4 我正在尝试使用 Python 脚本将视频的第一帧写入 PNG 图像 但我得到了一些奇怪的结果 这是代码 import numpy as np import cv i