OpenCV2.3.1をUbuntu11.10(64bit)にインストール

前置き

OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応

OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応

昨年末、OpenCV2の本が発売されたので自分も買ってみた。
しかしOpenCVのインストールでかなりハマってしまったので、手順のメモを書くことにした。
OSは、Ubuntu 11.10 (64bit)である。
ちなみにこの本、間違いが結構あって、正誤表はOpenCV 2プログラミングブック - サポートサイトにある。

何をインストールするか

画像処理ということで、当然Webカメラが欲しくなったので、

LOGICOOL ウェブカム HD画質 120万画素 C270

LOGICOOL ウェブカム HD画質 120万画素 C270

を買ってみた。
このカメラはドライバインストール不要で、UVCと言われるものらしい。
実は、
UVCのカメラ画像をOpenCVで操作(Windows Vista sp1) 涙目ブログ/ウェブリブログ
OpenCVを使って顔認識プログラムを作ってみた | ふじもんのブログ
などに、OpenCVはUVCに対応していないと書いてある。
しかし、
OpenCV で UVC(USB video device class)対応のカメラを使う | Moonmile Solutions Blog
を見ると、OpenCV2.3なら対応していると書いてある。
現在OpenCVの最新版は2.3.1であり、2.3で対応しているなら多分2.3.1でも対応しているはずなので、ここでは最新版の2.3.1をインストールすることを考える。
新しくインストールするなら最新版を入れるのは当然と思われるかもしれないが、aptで入手できるOpenCVは2.0をベースとしているらしい。
よって、最新版のソースをDLして自分でコンパイルする必要がある。
自分はまずaptで入手してしまってカメラが認識されずに困ってしまった。

ffmpeg

他サイトを見てソースからコンパイルしたとき、大体は上手くいくのだが、makeを実行したときに17%くらいのところでエラーになってしまった。
どうやら、cap_ffmpeg.cppをコンパイルするときにエラーになってしまっているらしい。
どう考えてもffmpegが悪い事をしている。残念ながら日本語のサイトにいい情報は見つからなかった。
これは、
Laz's Vision: OpenCV 2.3.1 on Ubuntu 10.10 or later
のコメントを見ることで解決した。
そこで同じようなエラーになっている人がいて、解決策としてURLが示されている。
A Comprehensive Guide to Installing and Configuring OpenCV 2.4.2 on Ubuntu - OzBotzOzBotz
OpenCV Installation Troubleshooting Guide - OzBotzOzBotz
に書いてあることが全てである。
ffmpegは現在最新版は0.10であるが、OpenCV2.3.1が対応しているバージョンは、ffmpeg0.8.xである。(ちなみに2.3以前は0.7.x)
もし新しいffmpegをインストールしてしまっているならばアンインストールして0.8.xをインストールする必要がある。
バージョンは、端末で

ffmpeg

を実行すれば見ることが出来る。
以下上のサイトに書いてある手順を書く。

インストール方法

ffmpegとx264をアンインストールする。(x264は意味があるか分からない)
sudo apt-get remove ffmpeg x264 libx264-dev
x264とffmpegの依存パッケージをインストールする。
sudo apt-get update
sudo apt-get install build-essential checkinstall git cmake libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev texi2html yasm zlib1g-dev
gstreamerをインストール
sudo apt-get install libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg
x264をDLして解凍してインストール(aptでもいい気がする)

ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
からどれかを選んで(x264-snapshot-20110808-2245-stable.tar.bz2なら間違いない)

./configure --enable-static
make
sudo make install
ffmpegをDLしてインストール

http://ffmpeg.org/download.html
から FFmpeg 0.8.10 "Love" をDLして解凍して

./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
make
sudo make install
その他いろいろインストール
sudo apt-get install libgtk2.0-0 libgtk2.0-dev libjpeg62 libjpeg62-dev libv4l-dev 
OpenCV2.3.1をインストール

http://sourceforge.net/projects/opencvlibrary/files/ からOpenCV-2.3.1.tar.bz2をDLして解凍してインストール

mkdir release
cd release
cmake ..
make
sudo make install

makeでエラーが出ていなかったら成功。
cmakeのとき自分の環境では下のようになった。

--   GUI: 
--     GTK+ 2.x:                   YES
--     GThread:                    YES
-- 
--   Media I/O: 
--     ZLib:                       YES
--     JPEG:                       TRUE
--     PNG:                        TRUE
--     TIFF:                       TRUE
--     JPEG 2000:                  TRUE
--     OpenEXR:                    YES
--     OpenNI:                     NO
--     OpenNI PrimeSensor Modules: NO
--     XIMEA:                      NO
-- 
--   Video I/O:
--     DC1394 1.x:                 NO
--     DC1394 2.x:                 NO
--     FFMPEG:                     YES
--       codec:                    YES
--       format:                   YES
--       util:                     YES
--       swscale:                  YES
--       gentoo-style:             YES
--     GStreamer:                  YES
--     UniCap:                     NO
--     PvAPI:                      NO
--     V4L/V4L2:                   Using libv4l
--     Xine:                       NO
-- 
--   Other third-party libraries:
--     Use IPP:                    NO
--     Use TBB:                    YES
--     Use ThreadingFramework:     NO
--     Use Cuda:                   NO
--     Use Eigen:                  YES
-- 
--   Interfaces:
--     Python:                     YES
--     Python interpreter:         /usr/bin/python2.7 -B (ver 2.7)
--     Python numpy:               YES
--     Java:                       NO
-- 
--   Documentation:
--     Sphinx:                     /usr/bin/sphinx-build (ver 1.0.7)
--     PdfLaTeX compiler:          /usr/bin/pdflatex
--     Build Documentation:        YES
-- 
--   Tests and samples:
--     Tests:                      YES
--     Examples:                   YES
-- 
--   Install path:                 /usr/local
-- 
--   cvconfig.h is in:             /home/it/OpenCV-2.3.1/release
-- -----------------------------------------------------------------

パスの設定

~/.bashrcに

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

を追加して

source ~/.bashrc

動作確認

#include <iostream>
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace std;

int main() {
	cv::VideoCapture cap(0);
  if (!cap.isOpened()) {
    cout << "カメラを開けない" << endl;
    return -1;
  }
  cv::namedWindow("camera", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
	while (1) {
		cv::Mat img;
		cap >> img;
		cv::imshow("camera", img);
		char ch = cv::waitKey(30);
		if ( ch == 27 ) break;      // ESCで終了
	}
}

を作って、simplecapture.cppとする。

g++ simplecapture.cpp `pkg-config --libs --cflags opencv`

のようにコンパイルして./a.outを実行した結果カメラの映像がウィンドウに表示されたら成功。