当前位置: 首页 > 知识库问答 >
问题:

使用OpenCV加速读取摄像机中的视频帧

奚卓
2023-03-14

目前,我已经用Python实现了我的应用程序,可以通过USB读取相机帧。我使用Opencv,但对于分辨率为60fps和1920x1080的相机,我无法以这种速度捕捉图像。我尝试了一些东西:cv2。视频捕获(0,cv2.CAP_FFMPEG),但我无法捕获帧(捕获读取返回False)。请您提出任何解决方案或方法来提高整体速度,甚至在GPU中处理它们。

    # Opencv 3.4.9 & Python 3.6.9
    import cv2    
    capture = cv2.VideoCapture(0, cv2.CAP_FFMPEG)

    while True:
        ret, frame = capture.read()
        if ret:
            cv2.imshow('Demo', frame)
            cv2.waitKey(1)

Opencv是从以下源代码构建的:

#!/usr/bin/env bash

set -e

VERSION='3.4.9'
DOWNLOAD_URL="https://github.com/opencv/opencv/archive/${VERSION}.zip"
CONTRIB_DOWNLOAD_URL="https://github.com/opencv/opencv_contrib/archive/${VERSION}.zip"
CURRENT_DIR="$(pwd)"
config_opencv_with_cuda() {
  cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D INSTALL_PYTHON_EXAMPLES=OFF \
        -D WITH_CUDA=ON \
        -D ENABLE_FAST_MATH=1 \
        -D CUDA_FAST_MATH=1 \
        -D WITH_CUBLAS=1 \
        -D WITH_V4L=ON \
        -D WITH_FFMPEG=ON \
        -D WITH_GSTREAMER=ON \
        -D BUILD_opencv_cnn_3dobj=OFF \
        -D BUILD_opencv_dnn_modern=OFF \
        -D OPENCV_EXTRA_MODULES_PATH=$CURRENT_DIR/opencv_contrib-$VERSION/modules \
        -D BUILD_DOCS=OFF \
        -D BUILD_PERF_TESTS=OFF \
        -D BUILD_TESTS=OFF \
        -D BUILD_EXAMPLES=OFF ..
}
echo 'Uninstalling pip installation'
pip3 uninstall opencv-python opencv-contrib-python

echo 'Installing dependencies'
apt-get update && apt-get install -y \
  build-essential cmake pkg-config \
  libjpeg-dev libtiff5-dev libpng12-dev \
  libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
  libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
  libxvidcore-dev libx264-dev \
  libgtk2.0-dev libgtk-3-dev \
  gfortran

wget -O opencv.zip "${DOWNLOAD_URL}"
wget -O opencv_contrib.zip "${CONTRIB_DOWNLOAD_URL}"
unzip opencv.zip && unzip opencv_contrib.zip
cd opencv-$VERSION
mkdir build
cd build

if [[ -d /usr/local/cuda ]]; then
  config_opencv_with_cuda
else
  config_opencv_without_cuda
fi

make -j $(nproc)
make install
ldconfig

共有1个答案

潘银龙
2023-03-14

无法捕获此速度的原因是VideoCapture在读取、解码和返回下一帧时阻塞了应用程序

如果我没弄错的话,你正在从你的USB读取电影文件。

您可以使用FileVideoStream对象来加速帧FileVideoStream使用队列结构进行读取、解码和返回。因此,在处理过程中不会阻止应用程序。

您需要安装imutils

  • pip:pip安装imutils
  • 蟒蛇:conda安装-c conda forge imutils

示例用法:

import cv2
from imutils.video import FileVideoStream as Fvs

fvs = Fvs(path="usb.mp4").start()

four_cc = cv2.VideoWriter_fourcc(*"mp4v")
writer = cv2.VideoWriter("out.mp4", four_cc, 60,
                         (1920, 1080), isColor=True)

while True:
    frame = fvs.read()

    # You write your processing code below here
    

    # If you are sure each usb frame size is (1920, 1080) comment the below state.
    frame = cv2.resize(frame, (1920, 1080))

    writer.write(frame)
    cv2.imshow("out", frame)

    if cv2.waitKey(0) & 0xFF == ord("q"):
        break

cv2.destroyAllWindows()
fvs.stop()
writer.release()
 类似资料:
  • 问题内容: 如何使用Python API使用OpenCV一次(或几乎)捕获两个或更多摄像机的视频? 我有三个可以进行视频流传输的网络摄像头,分别位于/ dev / video0,/ dev / video1和/ dev / video2。 以本教程为例,从单个摄像机捕获图像很简单: 这很好。 但是,如果我尝试初始化第二台相机,则尝试从它返回None: 为了确保我不会意外给OpenCV一个不好的相机

  • 本文向大家介绍opencv实现读取视频保存视频,包括了opencv实现读取视频保存视频的使用技巧和注意事项,需要的朋友参考一下 不得不说opencv是个强大的东东,以前做一个项目的一个模块时使用到进行图形处理,这次是想将一个视频的播放放慢,以前在网上看到opencv有这个功能,今天就不小心尝试了下,东西不多,主要是做个小记录还有一点要注意的小问题说一下,代码不多,基本上也都是copy的网上的 有几

  • 主要内容:第1步:加载OpenCV本机库,第2步:实例化视频捕获类,第3步:阅取帧,示例在本章中,我们将学习如何使用OpenCV使用系统摄像头捕获帧。包中的类包含使用相机捕获视频的类和方法。下面来一步一步学习如何捕捉帧 - 第1步:加载OpenCV本机库 在使用OpenCV库编写Java代码时,使用加载OpenCV本地库。加载OpenCV本机库,如下所示 - 第2步:实例化视频捕获类 使用本教程前面提到的函数来实例化类。 第3步:阅取帧 可以使用类的方法从相机读取帧。此方法接受类的对

  • 我计划用网络摄像机捕捉视频,然后用opencv处理,最后在google原生客户端环境下用opencv naclport在网页上显示输出 我现在意识到的是 使用javascript中的MediaStreamTrack接口和 然后 将其编码为Base64字符串并发送到c模块以使用opencv进行处理, 在cpp模块中,将其解码回Mat图像并进行处理,最后将其发送回浏览器进行显示。 所以我想知道,在op

  • 在使用Python的OpenCV中,当网络摄像头的fps和目录中的视频文件相同时,为什么视频文件以快进播放,而网络摄像头继续以正常速率显示帧?cv2扮演什么角色。waitKey()函数在此处播放

  • 问题内容: 如何访问我的IP摄像机流? 用于显示标准网络摄像头流的代码是 除了IP摄像机,我该如何做同样的事情? 我的系统: Python 2.7.14 OpenCV 2.4.9 Teledyne Dalsa Genie Nano XL相机 帮助将不胜感激 您可以将视频捕获对象用作 问题答案: 我回答了我自己的问题,报告了什么似乎是Python OpenCV中访问IP摄像机的 最全面的 总体过程。