it-swarm.com.de

Video kann nicht mit opencv geöffnet werden

Die opencv funktioniert gut, wenn Sie andere Dinge tun. Es kann Bilder öffnen und Bilder anzeigen. Es kann jedoch kein Video geöffnet werden.

Der Code, den ich zum Öffnen eines Videos verwende, ist wie folgt

import cv2

cap = cv2.VideoCapture("MOV_0006.mp4")

while True:
    ret, frame = cap.read()

    cv2.imshow('video', frame)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Bei der Ausführung werden jedoch Fehlermeldungen wie folgt ausgegeben

[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] no frame!

Meine vlc und mplayer können dieses Video abspielen, das opencv jedoch nicht. 

Ich habe das Codec-Paket x264 und libx264-142 installiert. (mit Sudo apt-get install)

Meine Version von Ubuntu ist 14.04 trusty.

Ich bin mir nicht sicher, ob es ein Codec-Problem ist oder nicht?

Ich habe opencv entweder mit WITH_UNICAP=ON oder mit WITH_UNICAP=OFF neu aufgebaut, aber das Problem ist dadurch überhaupt nicht betroffen. Die Fehlermeldungen ändern sich nie.

14
AnnieFromTaiwan

Es ist ein Codec-Problem

Ich habe diese mp4 - Datei in eine avi-Datei mit ffmpeg konvertiert. Dann kann der obige opencv-Code diese avi -Datei gut abspielen.

Daher bin ich mir sicher, dass dies ein Codec-Problem ist.

(Ich habe dann diese mp4 - Datei mit ffmpeg in eine andere mp4 - Datei konvertiert, wobei ich dachte, ffmpeg würde helfen, diesen ursprünglichen unlesbaren .mp4 - Codec zu verwandeln in einen lesbaren .mp4 - Codec, aber die resultierende .mp4 - Datei ist defekt. Diese Tatsache kann mit diesem Problem zusammenhängen oder auch nicht, nur erwähnen, falls jemand diese Informationen benötigt.)

Die Antwort darauf - FFmpeg neu erstellen, dann Opencv neu erstellen

Obwohl ich weiß, dass dies ein Codec-Problem ist, habe ich viele andere Möglichkeiten ausprobiert, konnte es aber immer noch nicht lösen. Endlich habe ich versucht, ffmpeg und opencv neu zu erstellen, dann war das Problem gelöst!

Das Folgende ist meine detaillierte Wiederherstellungsprozedur.

(1) ffmpeg erstellen

  1. Laden Sie ffmpeg-2.7.1.tar.bz2 herunter

    FFmpeg-Website: https://www.ffmpeg.org/download.html

    ffmpeg-2.7.1.tar.bz2-Link: http://ffmpeg.org/releases/ffmpeg-2.7.1.tar.bz2

  2. tar -xvf ffmpeg-2.7.1.tar.bz2
  3. cd ffmpeg-2.7.1
  4. ./configure --enable-pic --extra-ldexeflags=-pie

    Von http://www.ffmpeg.org/platform.html#Advanced-linking-configuration

    Wenn Sie FFmpeg-Bibliotheken statisch kompiliert haben und diese zum Erstellen Ihrer eigenen gemeinsam genutzten Bibliothek verwenden möchten, müssen Sie möglicherweise die PIC-Unterstützung erzwingen (mit --enable-pic Während der FFmpeg-Konfiguration).

    Wenn Ihre Zielplattform positionsunabhängige Binärdateien erfordert, sollten Sie das richtige Verknüpfungsflag (z. B. -pie) An --extra-ldexeflags Übergeben.


    Wenn Sie auf einen Fehler stoßen: yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

    Nur Sudo apt-get install yasm


    Weitere Erstellungsoptionen: https://trac.ffmpeg.org/wiki/CompilationGuide/Ubunt

    z.B. Durch Hinzufügen der Option --enable-libmp3lame Wird der png Encoder aktiviert. (Vor ./configure Müssen Sie Sudo apt-get install libmp3lame-dev Mit Version ≥ 3.98.3)

  5. make -j5 (Unter ffmpeg Ordner)
  6. Sudo make install

(2) OpenCV erstellen

  1. wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.Zip
  2. unzip opencv-2.4.9.Zip
  3. cd opencv-2.4.9
  4. mkdir build
  5. cd build
  6. cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_QT=OFF -D WITH_V4L=ON -D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ..

    Sie können diese Optionen in Abhängigkeit von Ihren Anforderungen ändern. Nur der letzte -D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic Ist die Schlüsseloption. Wenn Sie diesen weglassen, springt der make Fehler heraus.

    Dies ist auch von http://www.ffmpeg.org/platform.html#Advanced-linking-configuration (derselbe Link von Schritt 4 oben)

    Wenn Sie FFmpeg-Bibliotheken statisch kompiliert haben und damit Ihre eigene gemeinsam genutzte Bibliothek erstellen möchten, müssen Sie möglicherweise ... und Ihrem Projekt die folgende Option hinzufügen LDFLAGS: -Wl,-Bsymbolic

  7. make -j5
  8. Sudo make install
  9. Sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
  10. Sudo ldconfig

Jetzt sollte der opencv-Code eine mp4 - Datei gut abspielen!

Methoden, die ich versucht habe, aber nicht funktioniert hat

  1. Versuchen Sie, WITH_UNICAP=ONWITH_V4L=ON Hinzuzufügen, wenn cmake opencv. Hat aber überhaupt nicht funktioniert.
  2. Versuchen Sie, den Codec im python opencv-Code zu ändern. Aber vergebens.

    cap = cv2.VideoCapture("MOV_0006.mp4")

    print cap.get(cv2.cv.CV_CAP_PROP_FOURCC)

    Ich habe dies in zwei Umgebungen getestet. In der ersten Umgebung funktioniert opencv und in der anderen spielt opencv kein Video ab. Aber beide haben den gleichen Codec ausgedruckt 828601953.0.

    Ich habe versucht, ihren Codec durch cap.set(cv2.cv.CV_CAP_PROP_FOURCC, cv2.cv.CV_FOURCC(*'H264')) zu ändern, aber es hat überhaupt nicht funktioniert.

  3. Versuchen Sie, die Bibliotheken unter opencv-2.4.8/3rdparty/lib/ In Bibliotheken in meiner funktionsfähigen Umgebung zu ändern. Konnte aber nicht einmal erfolgreich bauen.

    Ich grep AVC: nal size Und finde, die Bibliotheken enthalten diese Fehlermeldung opencv-2.4.8/3rdparty/lib/libavcodec.a Usw. Deshalb habe ich versucht, sie zu ersetzen. Es stellt sich jedoch heraus, dass dies eine schlechte Idee ist.

  4. Sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

    Versuchen Sie, etwas davon und etwas davon zu installieren. Aber es war total nutzlos.

Probleme im Zusammenhang

Ich habe im Internet gesucht und es gibt viele ähnliche Probleme, aber KEINER von ihnen hatte eine Lösung!

Im Folgenden sind Probleme aufgeführt, die meiner Meinung nach gleich sind.

  • OpenCV/ffmpeg spielt mein mp4-Video nicht ab. - from opencv-users.nabble.com =

  • VideoCapture funktioniert in OpenCV 2.4.2 nicht. - from answers.opencv.org

    Dieser erwähnt den Wiederaufbau von ffmpeg! Aber die Argumente reichten mir nicht.

  • Mp4-Leseproblem - Ich habe OpenCV 2.4.1 und python 2.7) installiert und ein kurzes Programm erstellt, das die avi-Datei erfolgreich liest. Es ist jedoch mp4-Datei kann nicht gelesen werden. - von answers.opencv.org

  • Kann ".mp4" -Videodateien nicht mit OpenCV 2.4.3 öffnen, Python 2.7 in _Windows 7-Computer - - von Stapelüberlauf

  • OpenCV 2.4 VideoCapture funktioniert nicht nter Windows - von Stapelüberlauf

25
AnnieFromTaiwan

für Ubuntu 14.04 habe ich es so behoben.

die für OpenCV erforderlichen Abhängigkeiten installieren "

Sudo apt-get entfernen ffmpeg x264 libx264-dev

Sudo apt-get Update

Sudo apt-get install libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg 

Sudo apt-get -y Installieren Sie libopencv-dev build-essential. Git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libpp12-dev libpng12-dev libebas4-dev libjasper-dev libvcodec -dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libbt-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

Sudo add-apt-repository ppa: mc3man/gstffmpeg-keep

Sudo apt-get Update

Sudo apt-get install gstreamer0.10-ffmpeg

Sudo apt-get install gstreamer0.10-plugins-bad

Sudo apt-get Update

Ffmpeg in anaconda3 installieren "

conda install -c menpo ffmpeg = 2.7.0

Dowload Opencv 3.1.0 "

wget https://github.com/Itseez/opencv/archive/3.1.0.Zip unzip 3.1.0.Zip

mkdir build

cd bauen

cmake -DB-TABLE-TIFF = ON -DBUILD_opencv_Java = OFF -DWITH_CUDA = OFF -DWITH_FFMPEG = OFF -DENABLE_AVX = ON -DWITH_OPENGL = ON -DWITH_OPENCL = ON -DWITH_IPP = ON -DWITH_TBB = ON -DWITH_TB = ON -DWITH_TB = ON -DWITH_TB = ON -DWITH_TB = ON DBUILD_PERF_TESTS = OFF -DCMAKE_BUILD_TYPE = RELEASE -DCMAKE_INSTALL_PREFIX = $ (python3 -c "import sys; print") import get_python_inc; print (get_python_inc ()) ") -DPYTHON3_PACKAGES_PATH = $ (python3 -c" aus distutils.sysconfig import get_python_lib; print (get_python_lib ()) ") ..

make

Sudo make installieren

1
Jimmy