先日作ったOpenCVの環境がうまくないので修正しました。
問題は二つありました。
- インクルードファイルがすべてのOpenCV関数を網羅していないこと。
- ライブラリがすべてのOpenCV関数を網羅していないこと。
これらはビルド時間の削減、実行ファイルサイズの削減を狙っているのかも知れません。しかし、やはり「動かして、次に最適化」です。私の立場ではサイズ最適化や時間最適化は動いてから必要に応じて勉強すれば良いのであって、今からそれを狙っても同時に勉強すべき事が増えすぎて手に負えません。
ということで、それぞれ修正をかけました。
まず、ソースファイルですが、ここではインクルードファイルを整理しています。参考にしたページではインクルード・ファイルをOpenCVの機能毎に細かく指定していましたが、それをやめて、opencv.hppのみを読み込んでいます。
また、opencv/というパスを指定することで、インクルード・パスをコンパイラに指定する必要も無くなります。
#include <opencv2/opencv.hpp> #include <stdio.h> int main(int argc, const char* argv[]) { // 画像データをファイルから読み込む cv::Mat src = cv::imread("img/lena.jpg", cv::IMREAD_COLOR); // 画像の読み込みに失敗したらエラー終了する if(src.empty()) { std::cerr << "Failed to open image file." << std::endl; return -1; } cv::namedWindow("image", cv::WINDOW_AUTOSIZE); cv::imshow("image", src); cv::waitKey(0); cv::destroyAllWindows(); return 0; }
次に、インストーラーですが、これはOpenCV 3.1をダウンロードするようにしました。後から考えるとこれは別にOpenCV 3.0のままで良かったようですが、3.1で困ることもなさそうなので、変更したままにしています。
#! /bin/sh # Setting the Ubuntu for open-CV sudo apt-get -yV install cmake sudo apt-get -yV install libeigen3-dev # GUIフレームワーク関連 sudo apt-get -yV install libgtk2.0-dev sudo apt-get -yV install libgtkglext1-dev sudo apt-get -yV install libqt4-dev sudo apt-get -yV install freeglut3-dev # 並列処理関連 sudo apt-get -yV install opencl-headers sudo apt-get -yV install libtbb-dev # 画像フォーマット関連 sudo apt-get -yV install libjpeg-dev sudo apt-get -yV install libjasper-dev sudo apt-get -yV install libpng++-dev sudo apt-get -yV install libtiff-dev sudo apt-get -yV install libopenexr-dev sudo apt-get -yV install libwebp-dev # Python関連 # ubunt-14.04 #sudo apt-get -yV install libpython3.4-dev # ubuntu-16.04 #sudo apt-get -yV install libpython3.5-dev sudo apt-get -yV install libpython3-dev sudo apt-get -yV install python-numpy python-scipy python-matplotlib sudo apt-get -yV install python3-numpy python3-scipy python3-matplotlib # OpenCV の取得 # wget https://github.com/opencv/opencv/archive/3.0.0.tar.gz wget https://github.com/opencv/opencv/archive/3.1.0.tar.gz
このインストーラはUbuntuの設定をした後、OpenCV 3.1をダウンロードするだけです。実際の展開は手作業で行ってください。
展開した後、ターミナル・ウインドウを使ってOpenCV 3.1のディレクトリに入ります。次にコピーした以下のビルドスクリプトを実行してください。このスクリプトはcmakeを使ってmakeファイルを造り、ビルドします。これまでとは一箇所変えており、それによってlibopencv_world.soを作ります。
#!/bin/bash # Build script for Open-CV 3 # CMAKE build environment setting in open-cv directory SOURCE_DIR="echo $(cd $(dirname $0);pwd)" BUILD_DIR=${SOURCE_DIR}/build GENERATOR_NAME="Unix Makefiles" mkdir build cd build cmake \ -G "${GENERATOR_NAME}" \ --build ${BUILD_DIR} \ -D BUILD_CUDA_STUBS=OFF \ -D BUILD_DOCS=OFF \ -D BUILD_EXAMPLES=OFF \ -D BUILD_JASPER=OFF \ -D BUILD_JPEG=OFF \ -D BUILD_OPENEXR=OFF \ -D BUILD_PACKAGE=ON \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_PNG=OFF \ -D BUILD_SHARED_LIBS=ON \ -D BUILD_TBB=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_TIFF=OFF \ -D BUILD_WITH_DEBUG_INFO=ON \ -D BUILD_ZLIB=OFF \ -D BUILD_WEBP=OFF \ -D BUILD_opencv_apps=ON \ -D BUILD_opencv_calib3d=ON \ -D BUILD_opencv_core=ON \ -D BUILD_opencv_cudaarithm=OFF \ -D BUILD_opencv_cudabgsegm=OFF \ -D BUILD_opencv_cudacodec=OFF \ -D BUILD_opencv_cudafeatures2d=OFF \ -D BUILD_opencv_cudafilters=OFF \ -D BUILD_opencv_cudaimgproc=OFF \ -D BUILD_opencv_cudalegacy=OFF \ -D BUILD_opencv_cudaobjdetect=OFF \ -D BUILD_opencv_cudaoptflow=OFF \ -D BUILD_opencv_cudastereo=OFF \ -D BUILD_opencv_cudawarping=OFF \ -D BUILD_opencv_cudev=OFF \ -D BUILD_opencv_features2d=ON \ -D BUILD_opencv_flann=ON \ -D BUILD_opencv_hal=ON \ -D BUILD_opencv_highgui=ON \ -D BUILD_opencv_imgcodecs=ON \ -D BUILD_opencv_imgproc=ON \ -D BUILD_opencv_java=OFF \ -D BUILD_opencv_ml=ON \ -D BUILD_opencv_objdetect=ON \ -D BUILD_opencv_photo=ON \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=ON \ -D BUILD_opencv_shape=ON \ -D BUILD_opencv_stitching=ON \ -D BUILD_opencv_superres=ON \ -D BUILD_opencv_ts=ON \ -D BUILD_opencv_video=ON \ -D BUILD_opencv_videoio=ON \ -D BUILD_opencv_videostab=ON \ -D BUILD_opencv_viz=OFF \ -D BUILD_opencv_world=ON \ -D CMAKE_BUILD_TYPE=RELEASE \ -D WITH_1394=ON \ -D WITH_CUBLAS=OFF \ -D WITH_CUDA=OFF \ -D WITH_CUFFT=OFF \ -D WITH_EIGEN=ON \ -D WITH_FFMPEG=ON \ -D WITH_GDAL=OFF \ -D WITH_GPHOTO2=OFF \ -D WITH_GIGEAPI=ON \ -D WITH_GSTREAMER=ON \ -D WITH_GTK=ON \ -D WITH_INTELPERC=OFF \ -D WITH_IPP=ON \ -D WITH_IPP_A=OFF \ -D WITH_JASPER=ON \ -D WITH_JPEG=ON \ -D WITH_LIBV4L=ON \ -D WITH_OPENCL=ON \ -D WITH_OPENCLAMDBLAS=OFF \ -D WITH_OPENCLAMDFFT=OFF \ -D WITH_OPENCL_SVM=ON \ -D WITH_OPENEXR=ON \ -D WITH_OPENGL=ON \ -D WITH_OPENMP=OFF \ -D WITH_OPENNI=OFF \ -D WITH_PNG=ON \ -D WITH_PTHREADS_PF=OFF \ -D WITH_PVAPI=ON \ -D WITH_QT=ON \ -D WITH_TBB=ON \ -D WITH_TIFF=ON \ -D WITH_UNICAP=OFF \ -D WITH_V4L=OFF \ -D WITH_VTK=OFF \ -D WITH_WEBP=ON \ -D WITH_XIMEA=OFF \ -D WITH_XINE=OFF \ ${SOURCE_DIR} # make the library make -j2 # install the library sudo make install # conifugre the dynamic links sudo ldconfig
スクリプトの実行が終わると、libopencv_world.soがインストールされます。実際のアプリではこのlibopencv_world.so のみリンクすれば、Open CVのすべての関数を使用できます。