mjpg-streamerを用いて、opencvで加工したwebカメラ映像をストリーミングしたかったけど、makeしてもinput_opencv.soが生成されなかった。最終的にopencvのバージョンとCMakeListsの記述を変更することでうまくいったのでメモ。
動作環境
- Raspberry Pi4
- Python 3.7.3
- OpenCV 3.4.6
input_opencvのCMakeLists.txtの記述を変更
mjpg-streamerのplugins/input_opencv
フォルダ内は以下のような階層だった。
│ CMakeLists.txt
│ input_opencv.cpp
│ input_opencv.h
│ README.md
│
└─filters
├─cvfilter_cpp
│ CMakeLists.txt
│ filter_cpp.cpp
│ README.md
│
└─cvfilter_py
│ CMakeLists.txt
│ conversion.cpp
│ conversion.h
│ example_filter.py
│ filter_py.cpp
│ README.md
│
└─cmake
FindNumpy.cmake
このうち直下とfilters/cvfilter_cppとfilters/cvfilter_py階層の3か所にCMakeLists.txtがある。
今回はpython用なので、input_opencvフォルダとcvfilter_pyフォルダにあるCMakeLists.txtを編集する。
input_opencvフォルダのCMakeLists.txt編集内容は以下のようにONLYIF OpenCV_FOUND #${OpenCV_VERSION_MAJOR} EQUAL 3
の記述を削除すればよいらしい。opencv3系を入れていてもこの記述があるせいでうまくいかないのは謎。
#MJPG_STREAMER_PLUGIN_OPTION(input_opencv "OpenCV input #plugin"
# ONLYIF OpenCV_FOUND #${OpenCV_VERSION_MAJOR} EQUAL 3)
#↑ここを
#↓こうする
MJPG_STREAMER_PLUGIN_OPTION(input_opencv "OpenCV input plugin")
cvfilter_pyフォルダにあるCMakeLists.txtも同様に編集しておく。
OpenCVのバージョンは3系が必要
最初OpenCV4系でトライしてたけど、make中にエラーになったので3系にしたらすんなりmakeできた。
まず古いバージョンのOpenCVを消す。
$ cd /mnt/opencv/build
$ sudo make uninstall
$ sudo rm -rf /usr/local/include/opencv
これでもpythonでOpenCVがimportできてしまう場合はpythonからパッケージの場所を確認してそのフォルダを削除する。
import cv2
print(cv2.__file__)
#/usr/local/lib/python3.7/dist-packages/cv2/...←パスが表示されるのでこのフォルダを削除
他の記事を参照してOpenCV3.4.6をビルドインストールする。
$ sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt install libxvidcore-dev libx264-dev libgtk2.0-dev libatlas-base-dev gfortran
$ sudo apt install python3-dev python3-pip
$ sudo pip3 install numpy
#追加(GStreamer)
$ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev
$ cd /usr/include
$ sudo ln -s libv4l1-videodev.h videodev.h
#download OpenCV3
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.6.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.6.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip
$ cd opencv
$ mkdir build
$ cd build
$ sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.6/modules \
-D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/lib/python3.7/dist-packages \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_EXAMPLES=ON \
-D WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
..
$ sudo make clean
$ sudo make -j4
$ sudo make install
$ sudo ldconfig
最後にpythonでimportできたか確認
import cv2
print(cv2.__version__)
最後に、mjpg-streamerをmakeする。
$ cd ~/mjpg-streamer/mjpg-streamer-experimental
$ sudo make
$ sudo make install
無事input_opencv.soが生成されていれば終了。