使用 OpenCV 捕获 H264 流

2024-03-25

所以。一段时间以来,我一直在尝试让我的 Raspberry Pi 2 使用 OpenCV 从我的 Logitech C920 捕获 H264 流。我一直在互联网上搜寻信息,但没有运气。

简短的系统描述:

  • Raspberry Pi 2,运行 Raspbian,内核 3.18
  • 罗技 HD Pro 网络摄像头 c920
  • OpenCV 2.4.11
  • BonesCV - 归功于 Derek Molloy (https://github.com/derekmolloy/boneCV https://github.com/derekmolloy/boneCV)
  • libx264 和 FFMPEG(内置 x264 支持)
  • libv4l-dev、v4l-utils、qv4l2、v4l2ucp

我知道 OpenCV 强制格式为 BGR24 (MJPG)。这在中指定cap_libv4l.cpp https://github.com/Itseez/opencv/blob/2.4.11/modules/highgui/src/cap_libv4l.cpp。它看起来像这样(第 692 行->):

  /* libv4l will convert from any format to V4L2_PIX_FMT_BGR24 */
  CLEAR (capture->form);
  capture->form.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  capture->form.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
  capture->form.fmt.pix.field       = V4L2_FIELD_ANY;
  capture->form.fmt.pix.width = capture->width;
  capture->form.fmt.pix.height = capture->height;

我可以使用 v4l2-ctl --set-fmt-video 手动设置像素格式

pi@raspberrypi ~/boneCV$ v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=H264
pi@raspberrypi ~/boneCV$ v4l2-ctl --get-fmt-video
Format Video Capture:
        Width/Height  : 1920/1080
        Pixel Format  : 'H264'
        Field         : None
        Bytes per Line: 3840
        Size Image    : 4147200
        Colotspace    : SRGB

如果我现在运行“./boneCV” - 一个非常简单的捕获程序,可以捕获图片并进行精明的边缘检测。 (我将在最后添加代码)。我明白了:

pi@raspberrypi ~/boneCV$ ./boneCV
pi@raspberrypi ~/boneCV$ v4l2-ctl --get-fmt-video
Format Video Capture:
        Width/Height  : 1920/1080
        Pixel Format  : 'MJPG'
        Field         : None
        Bytes per Line: 0
        Size Image    : 4147200
        Colorspace    : SRGB

您可以看到“像素格式”和“每行字节数”的变化。 “Field”保持为 None,“Colourspace”保持为 SRGB。 然后我尝试将 cap_lib4vl.cpp 中的每个“V4L2_PIX_FMT_BGR24”替换为“V4L2_PIX_FMT_H264”并重建 OpenCV。然后,当我运行“./boneCV”时,我的两个 .png 图像只是黑色,带有一两条白色条纹。

为了查明它是 libv4l 还是 OpenCV,我运行了遵循 Derek Molloys Bones 的“./capture”脚本。它直接使用 libv4l 并毫无问题地捕获 H264 视频流。然后我必须使用“./raw2mpg4”才能观看它。 .mp4 文件的分辨率为 1920x1080,帧速率为 30 fps,没有任何故障。之后我再次检查了“v4l2-ctl --get-fmt-video”并得到了这个:

pi@raspberrypi ~/boneCV$ v4l2-ctl --get-fmt-video
Format Video Capture:
        Width/Height  : 1920/1080
        Pixel Format  : 'H264'
        Field         : None
        Bytes per Line: 3840
        Size Image    : 4147200
        Colotspace    : SRGB

与我手动设置所有内容时完全相同。

我得出的结论是,如果我希望 OpenCV 能够捕获原始 H264 流,我必须更改 cap_libv4l.cpp,但我不知道如何更改。我认为这可能是因为每帧位数和/或色彩空间的差异。有谁知道如何做到这一点或如何制定解决方法,以便我仍然可以使用 OpenCV 的“VideoCapture”功能?

我知道如果这个问题有任何解决方案,很多 Raspberry Pi 和 BeagleboneBlack 用户都会非常感激。 我已尽力涵盖我认为相关的所有内容,如果我还可以提供更多内容来更好地描绘图片,请说出来。

她提到的脚本和程序的一些链接:(编辑。我尝试发布每个程序的链接,但我没有足够的声誉。转到 Derek Molloys github 页面,你会在那里找到骨头CV。)

不,我不能使用“CV_FOURCC('H','2','6','4');”因为linux还没有实现这个功能。


None

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

使用 OpenCV 捕获 H264 流 的相关文章

随机推荐

  • 在父 div 中间创建一个 div

    我正在努力保持 chat innerdiv 位于中间 chat maindiv 我可以通过使用百分比值来做到这一点 但我的问题是应该有2px百分比值无法提供的间隙 相对于宽度和高度 为了清楚地理解 请参阅 CSS 代码中的注释 JSbin
  • 如何四舍五入到最接近的千?

    如何将数字四舍五入到最接近的千位 function round var Round it PHP 允许负精度round例如 x round x 3 Uses default mode of PHP ROUND HALF UP 而正精度表示在
  • 如何让d3的translate:translate-drag功能更加流畅?

    In 这个 JSFiddle https jsfiddle net sachid 8d6ht3dL 我已经在 svg 中实现了元素 我希望这组元素可以拖动 并且我已经尝试过d3 drag并使用transform translate 拖动并不
  • 在 AKS 集群中安装 nginx ingress 失败并出现 SyncLoadBalancerFailed 错误

    我有一个带有 Web 应用程序的 AKS 集群 我想配置一个 nginx Ingress 控制器以将应用程序公开到互联网 然后启用 TLS 我一直在关注官方文档 https learn microsoft com en us azure a
  • 当我尝试连接 Box.com 的 API 时,rauth2 解码器无法处理 access_token

    这是我用于连接到 Box 的代码 但我无法让 box storage get auth session data data 工作 从 rauth 导入 OAuth2Service box storage OAuth2Service name
  • 如何在 Android 中处理 3 个嵌套回收器视图中的数据 [Kotlin]

    我有一个由三个回收者视图组成的结构 因此 有一个父回收器视图包含一个子回收器视图 而该子回收器视图又包含一个子回收器视图 为了理解 就像第一个回收者视图是楼层总数 第二个回收者视图是房间总数 第三个回收者视图是设备总数 我有一个房间数据库
  • Objective-C 将数字舍入到最接近的 50

    如何将数字四舍五入到最接近的 X 值 例如 50 IE 47 就是 50 24 将是 0 74 就是 50 99 就是 100 etc 我真的不知道从哪里开始研究如何做到这一点 附 我在 iPhone 上使用 cocoa touch 多谢
  • 使用lambdaify将硬积分转换为lambda函数

    我想对函数进行羔羊化Integral t t t 0 x 它有效 但是我的新函数由lambdify 不返回数字 而仅返回sympy integrals integrals Integral班级 但我不希望这样 我希望它返回一个浮点数 这是我
  • Hibernate 不保存值的集合

    好吧 我现在已经在几个项目中使用了 Hibernate 但在使用它之前我并没有了解它的复杂性 我开始查看使用 JPA 注释并与 Spring 集成的代码 一切运行良好 但现在我想向我的学生教授基本的 Hibernate 并且我正在创建一个示
  • 如何摆脱“从预捆绑文件加载”消息?

    在启动屏幕之后 但在加载应用程序之前 屏幕顶部会出现一条 正在从预捆绑文件加载 消息 持续时间只有几百毫秒 我在开发中不介意这一点 但在手机上运行时我仍然看到此消息 这是我创建捆绑包的方法 有任何想法吗 谢谢 react native bu
  • Cardview Click 未打开活动

    我的问题 no error in this project i can run successful 我的按钮可以在特定时间点击 当我点击回来时 它根本不起作用 我认为我的问题与父母有关 我的项目父级有什么错误 请帮帮我 下面是我的 Jav
  • WCF Web服务流响应的最佳实践

    我正在尝试从 WCF Web 服务中提取大量数据 请求相当小 而响应消息将非常大 目前 由于 IIS6 对其可分配的内存 1 4GB 有限制 Web 服务正在引发 SystemOutOfMemory 异常 我在一些博客中读到 实施流式传输可
  • 如何优雅地降级 CSS 视口单位?

    CSS 视口单位 vw vh vmin vmax 非常棒 我想开始将它们用于字体 但我注意到here http caniuse com viewport units他们没有得到广泛的支持 我尝试在不支持的浏览器中搜索任何用于优雅降级的最佳实
  • ASP.NET MVC 4 参数由正斜杠“/”分隔,未正确传递参数

    我试图遵循许多网站使用的约定 这些网站使用多个正斜杠传递参数 而不是使用 GET 模型 也就是说 我希望使用如下 URL http www foo bar controller action arg1 a arg2 b arg3 c 以这种
  • jquery-select2 ajax搜索在另一个div中显示标签

    我想在另一个 div 中显示所选结果 而不是在输入框中显示 function formatRepo repo if repo loading return repo text var markup div class select2 res
  • 计算出的“goto”是否尊重 C++ 对象的生命周期?

    Regular goto在 C 中尊重对象生命周期 即使用goto跳出块将为适当的局部变量运行析构函数 start NonTrivial object if again goto start will call object NonTriv
  • 为什么oracle区分大小写?

    Oracle 默认区分大小写 而 SQL Server 和 MySQL 等其他数据库默认不区分大小写 这是否有原因 我知道有一些方法可以启用 禁用区分大小写 但 Oracle 与其他数据库不同似乎很奇怪 我还试图了解区分大小写的原因 我可以
  • 如何在 RichFaces/JSF 页面中嵌入和调用 javascript 脚本

    我一直在寻找一种在 JSF 页面中嵌入和调用 javascript 函数的方法 我也在使用 RichFaces 为了定义该函数 我似乎可以以跨浏览器支持的方式执行此操作
  • 模板参数中的自引用模板

    我该怎么做才能使这项工作成功 template
  • 使用 OpenCV 捕获 H264 流

    所以 一段时间以来 我一直在尝试让我的 Raspberry Pi 2 使用 OpenCV 从我的 Logitech C920 捕获 H264 流 我一直在互联网上搜寻信息 但没有运气 简短的系统描述 Raspberry Pi 2 运行 Ra