ラズパイでmjpg-streamerのopencvプラグインを使う＋OpenCVのビルドインストール(備忘録)

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`フォルダ内は以下のような階層だった。

```text: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系を入れていてもこの記述があるせいでうまくいかないのは謎。

```bash:CMakeLists.txt
#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を消す。

```terminal
$ cd /mnt/opencv/build
$ sudo make uninstall
$ sudo rm -rf /usr/local/include/opencv
```

これでもpythonでOpenCVがimportできてしまう場合はpythonからパッケージの場所を確認してそのフォルダを削除する。

```python
import cv2
print(cv2.__file__)
#/usr/local/lib/python3.7/dist-packages/cv2/...←パスが表示されるのでこのフォルダを削除
```



他の記事を参照してOpenCV3.4.6をビルドインストールする。

```terminal
$ 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できたか確認

```python
import cv2
print(cv2.__version__)
```



最後に、mjpg-streamerをmakeする。

```terminal
$ cd ~/mjpg-streamer/mjpg-streamer-experimental
$ sudo make
$ sudo make install
```

無事input_opencv.soが生成されていれば終了。





## 参考元
- [GitHub - jacksonliam/mjpg-streamer: Fork of http://sourceforge.net/projects/mjpg-streamer/](https://github.com/jacksonliam/mjpg-streamer)
- [pythonのパッケージの保存場所](https://qiita.com/ophhdn/items/4d3ecc6354d92b7ac0ba)
- [Qiita - OpenCVの入れ直し](https://qiita.com/aprilis/items/411c68c662707429610c)
- [detamamoruのブログ - Raspberry Pi B+でinsta360 airの動画をOpenCVで処理する](https://detamamoru.hateblo.jp/entry/2020/02/16/205734)