OpenCV 3系でCUDAを使おう in Ubuntu
こんばんは。pizzaxです。
今日はUbuntuにOpenCVをインストールし、GPUモジュールを使ってみましょう。
CUDAモジュールを用いる為には、apt-getからインストールではなく、ビルドが必要です。
Ubuntu16.04 + CUDA-8.0rc 上で試したらエラーが起きました!!助けてください。
現状打開できませんでした。エラーは後述します。
できること
- 必要パッケージをインストール 下記のパッケージをインストールします。
- ソースコードをダウンロード
- make
sudo apt-get install cmake-curses-gui #pizzaxの好みにより追加 sudo apt-get install build-essential cmake git sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip
引用元: 公式docment
※公式サイトからダウンロードします。今回は ~/にダウンロードします。
cd ~/ unzip opencv-3.1.0.zip cd opencv-3.1.0
※公式サイトからダウンロードでもOKです。なぜか容量が違います。
mkdir build cd build cmake -D WITH_CUDA=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX/usr/local/ .. #install_prefixはお好みのディレクトリでどうぞ make -j8 #-jn のnにはCPUのプロセッサ数を入力 sudo make install
実際にコードを動かしてみましょう。
#include <iostream> #include <opencv2/highgui/highgui.h> int main (int argc, int *argv[]){ if (argc < 2){ std::cout << "入力画像がありません。" <<std::endl; std::cout << "usage :" << argv[0] <<" <imagefile> " << std:endl; return 1; } cv::Mat image; //画像を入れるクラスです。実態は一次元配列です。 image = cv::imread(argv[1]); //先述の画像用クラスに、第一引数の画像を入力します。 cv::imshow("image",image); // "image"というウィンドウに 先述の画像用クラスを表示します。 return 0; }
※Matは本来配列用クラスで画像用クラスではありません。
これを適当なディレクトリにコピーします。
ファイル名をmain.cppとします。
コンパイル&実行
g++ main.cpp -o main `pkg-config --cflags -libs opencv` ./main <imagefile> //<imagefile>には好きな画像ファイルを渡します。
紳士なチキンに試してもらったところ、Ubuntu16.04 + CUDA-8.0 では下記のエラーが出て突破できませんでした。。。
opencv/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppState, Npp8u* pDeviceMem);
だれかたすけて。