JuvenileTalk9
@JuvenileTalk9

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

OpenCV3をFFmpegとリンクさせてソースビルドしたい

解決したいこと

OpenCVをソースビルドする際に、FFmpegのGPL汚染を避けるためOpenH264とリンクしたLGPLのFFmpegとリンクさせようとしています。この際、OpenCV4系ではビルドが成功しますが、OpenCV3系では同じ手順で実行してもcmakeでエラーが発生してしまいます。

OpenCV3系のcmake時に自前でビルドしたFFmpegを認識させるためにはどうしたらよいでしょうか?

バージョン

  • Ubuntu 20.04
  • OpenCV 3.4.9 / 4.6.0
  • FFmpeg 4.3.5
  • Python 3.8.10
  • gcc 9.4.0
  • cmake 3.16.3

OpenCV4でうまくいくときの手順

関連パッケージのインストール

sudo apt install gcc g++ make cmake git nasm python3-venv libpython3.8-dev

OpenH264のビルドインストール

cd ~
git clone -b v2.3.1 https://github.com/cisco/openh264
cd openh264
make -j4
sudo make install
ls /usr/local/lib
# libopenh264.a  libopenh264.so  libopenh264.so.2.3.1  libopenh264.so.7  pkgconfig  python3.8
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ls ${PKG_CONFIG_PATH}
# openh264.pc

FFmpegビルドインストール

cd ~
git clone -b n4.3.5 https://github.com/FFmpeg/FFmpeg ffmpeg-n4.3.5
cd ffmpeg-n4.3.5
./configure \
    --enable-libopenh264 \
    --enable-optimizations \
    --enable-static \
    --enable-version3 \
    --enable-shared \
    --disable-gpl \
    --disable-logging \
    --disable-doc \
    --disable-htmlpages \
    --disable-manpages \
    --disable-podpages \
    --disable-txtpages \
    --disable-avdevice \
    --disable-postproc \
    --disable-bzlib \
    --disable-iconv \
    --disable-cuda \
    --disable-cuvid \
    --disable-debug \
    --extra-ldflags="-static-libgcc -static-libstdc++"
make -j4
sudo make install
sudo ldconfig
ffmpeg -version
# ffmpeg version n4.3.5 Copyright (c) 2000-2022 the FFmpeg developers
# built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
# (略)
ls ${PKG_CONFIG_PATH}
# libavcodec.pc  libavfilter.pc  libavformat.pc  libavutil.pc  libswresample.pc  libswscale.pc  openh264.pc

Pythonのvenv作成(動作確認目的でPythonを利用/ビルドするだけなら不要)

cd ~
python3 -m venv venv
source venv/bin/activate
pip install numpy==1.18.5

OpenCV4ビルドインストール

cd ~
wget https://github.com/opencv/opencv/archive/4.6.0.zip -O opencv-4.6.0.zip
unzip opencv-4.6.0.zip
cd opencv-4.6.0
mkdir build
cd build
export INSTALL_DIR=/home/vboxuser/opencv4
cmake \
    -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}/build \
    -DOPENCV_PYTHON_INSTALL_PATH=${INSTALL_DIR} \
    -DHAVE_opencv_python2=OFF \
    -DHAVE_opencv_python3=ON \
    -DBUILD_opencv_python2=OFF \
    -DBUILD_opencv_python3=ON \
    -DPYTHON3_EXECUTABLE=$(which python) \
    -DPYTHON_DEFAULT_EXECUTABLE=$(which python) \
    -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
    -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
    -DOPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
    -DBUILD_DOCS=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_JAVA=OFF \
    -DWITH_1394=OFF \
    -DWITH_CUDA=OFF \
    -DWITH_CUFFT=OFF \
    -DWITH_FFMPEG=ON \
    -DWITH_GSTREAMERE=OFF \
    -DWITH_GTK=OFF \
    -DWITH_IPP=OFF \
    -DWITH_JASPERE=OFF \
    -DWITH_JPEG=ON \
    -DWITH_OPENEXR=OFF \
    -DWITH_PNG=ON \
    -DWITH_TIFF=ON \
    -DWITH_V4L=OFF \
    -DWITH_GPHOTO2=OFF \
    -DWITH_CUBLAS=OFF \
    -DWITH_VTK=OFF \
    -DWITH_NVCUVID=OFF \
    ..
# 以下のログが出力され、FFmpegを認識していることが確認できる
# --   Video I/O:
# --     FFMPEG:                      YES (find_package)
# --       avcodec:                   YES (58.91.100)
# --       avformat:                  YES (58.45.100)
# --       avutil:                    YES (56.51.100)
# --       swscale:                   YES (5.7.100)
# --       avresample:                NO
# --     GStreamer:                   NO
make -j4
make install
echo ${INSTALL_DIR}/build/lib | sudo tee /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
export PYTHONPATH=${INSTALL_DIR}/cv2/python-3.8
python -c "import cv2; cap = cv2.VideoCapture('bunny.mp4'); print(cap.isOpened())"
# True

OpenCV3でうまくいかないときの手順

※OpenCV3ビルドインストール直前まではOpenCV4までと共通

OpenCV3ビルドインストール

cd ~
wget https://github.com/opencv/opencv/archive/3.4.9.zip -O opencv-3.4.9.zip
unzip opencv-3.4.9.zip
cd opencv-3.4.9
mkdir build
cd build
export INSTALL_DIR=/home/vboxuser/opencv3
cmake \
    -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}/build \
    -DOPENCV_PYTHON_INSTALL_PATH=${INSTALL_DIR} \
    -DHAVE_opencv_python2=OFF \
    -DHAVE_opencv_python3=ON \
    -DBUILD_opencv_python2=OFF \
    -DBUILD_opencv_python3=ON \
    -DPYTHON3_EXECUTABLE=$(which python) \
    -DPYTHON_DEFAULT_EXECUTABLE=$(which python) \
    -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
    -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
    -DOPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
    -DBUILD_DOCS=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_JAVA=OFF \
    -DWITH_1394=OFF \
    -DWITH_CUDA=OFF \
    -DWITH_CUFFT=OFF \
    -DWITH_FFMPEG=ON \
    -DWITH_GSTREAMERE=OFF \
    -DWITH_GTK=OFF \
    -DWITH_IPP=OFF \
    -DWITH_JASPERE=OFF \
    -DWITH_JPEG=ON \
    -DWITH_OPENEXR=OFF \
    -DWITH_PNG=ON \
    -DWITH_TIFF=ON \
    -DWITH_V4L=OFF \
    -DWITH_GPHOTO2=OFF \
    -DWITH_CUBLAS=OFF \
    -DWITH_VTK=OFF \
    -DWITH_NVCUVID=OFF \
    ..
# 以下のログが出力され、FFmpegを認識していないことが確認できる
# --   Video I/O:
# --     FFMPEG:                      NO (find_package)
# --       avcodec:                   NO
# --       avformat:                  NO
# --       avutil:                    NO
# --       swscale:                   NO
# --       avresample:                NO
# --     GStreamer:                   NO
make -j4
make install
echo ${INSTALL_DIR}/build/lib | sudo tee /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
export PYTHONPATH=${INSTALL_DIR}/cv2/python-3.8
python -c "import cv2; cap = cv2.VideoCapture('bunny.mp4'); print(cap.isOpened())"
# False
0

1Answer

find packageで認識できるffmpegがみつからないのかな?と。対応バージョンを調べて、古いバージョンをINSTすれば良さそうな気がします。が、どうなんでしょうね

0Like

Your answer might help someone💌