flying penguin

Ubuntuが好きな管理人二人がお送りする技術ブログ。

OpenCV 3系でCUDAを使おう in Ubuntu

こんばんは。pizzaxです。
今日はUbuntuOpenCVをインストールし、GPUモジュールを使ってみましょう。
CUDAモジュールを用いる為には、apt-getからインストールではなく、ビルドが必要です。

Ubuntu16.04 + CUDA-8.0rc 上で試したらエラーが起きました!!助けてください。
現状打開できませんでした。エラーは後述します。

この記事は下記の方を対象としています。
  • OpenCVUbuntu(Linux)にインストールしたい!(今回はUbuntu 14.04にインストールします。)
  • そしてGPU積んでるし活用したい!
できること
  • OpenCV 3.1をUbuntuにインストール(CUDAモジュール含む)
  • とりあえず画像表示

  1. 必要パッケージをインストール
  2. 下記のパッケージをインストールします。

    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



  3. ソースコードをダウンロード

  4. 公式サイトからダウンロードします。今回は ~/にダウンロードします。

    cd ~/
    unzip opencv-3.1.0.zip
    cd opencv-3.1.0
    

    公式サイトからダウンロードでもOKです。なぜか容量が違います。


  5. make
  6. 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);

だれかたすけて。