2014年4月27日日曜日

OpenCV 2.4.9 ビルドと/Zmオプション(C1076)

OpenCV 2.4.9のビルド時にC1076エラーが発生した

Windows + VC11ビルドでC1076, C3859エラー

OpenCV2.4.9をWindowsでVisual C++2012(VC11)を用いてビルドしたところ次のエラーがopencv_contrib, opencv_stitchingで発生しました.コレに追随して依存しているモジュールもビルドが出来ませんでした.

error C1076: コンパイラの制限 : 内部ヒープの上限に達しました。上限を変更するには /Zm オプションを使用してください。

error C3859: PCH の仮想メモリの範囲が超えています。'-Zm118' 以上のコマンド ライン オプションで再コンパイルしてください。




このC1076というエラー「このエラーは、シンボルが多すぎるか、テンプレートのインスタンス生成が多すぎることが原因で発生する場合が」あるそうです.(参照)

というわけで該当したopencv_contrib, opencv_stitichingに/Zmオプションを追加してみます.

/Zmオプションの追加

opencv_contribとopencv_stitchingのプロパティそれぞれを開き
「C/C++」→「コンパイラオプション」を開き/Zmオプションを追加します.


また,Debug, Releaseの共通するオプションであるため,「構成」を「すべての構成」にします.

エラーではZm118以上を指定するようにされていました.数値が多きほど割り当てられるメモリ量が大きくなるようですね.ここでは150を指定してみます./Zmと150の間に空白をいれません.

/Zm150と追加したところ

総括

OpenCV2.4.9のビルドではopencv_contribとopencv_stichingに/Zmオプションを追加してビルドします.(たしかOpenCV2.4.8でもいくつかのモジュールに同様の設定を行わなければいけなかったはず...)


2014年4月24日木曜日

OpenNIついに閉鎖か...orz..

OpenNIがついに閉鎖,こんな閉鎖の仕方なの??

OpenNIが2014年4月23日をもって閉鎖と発表されています.前日の22日にはトップページに閉鎖を告げる告知が成されていました.私も大慌てでOpenNIやNiTEなどをダウンロードしておきました.もう永久保存版ですね.

で,閉鎖前日のOpenNIのサイトwww.openni.orgにアクセスするとこのようなページでした.↓
www.openni.org 閉鎖前日(2014/04/23)

デカデカと閉鎖の告知がされていました.

Important
Software downloads will continue to be avaiirable until April 23rd 2014 at which time the OpenNI website will be closed.


その後,平成26年4月24日(木)の午前3時頃再びアクセスしてみると...
えッ,,,まさかのエラー↓(自宅のネットワークが落ちたわけじゃないよなぁ..と確認しつつ..)

まさか,サーバ毎突然アクセスできなくなるとは...!(O_O)
なかなかやりますな....そして残念です.


個人的にはWindows XPのサポートを終えたマイクロソフト社のように何らかの告知をしばらく続けるのかと思いきや,そんなこと成しにいきなりサーバが消えました..

マイクロソフトのWindows XPサポートページ(2014/04/24現在)

深度センサのXtion Pro Liveには末永くお世話になるつもりだったので残念です.
この分野は現在,めざましく技術革新を続けているのでこういった変化への対応も必要ですが,なんとなく寂しいと言えば寂しいですね.

OpenNIはオープンソース

Kinectのお使いの方はマイクロソフト社の公式SDKを使いましょう.さて,Xtionの方も単純に光学画像と距離画像を取り込むOpenNIはオープンソースであるため,まだ入手可能です.
OpenNIのgithub(https://github.com/OpenNI/OpenNI)からソースコードを入手できますね!
こちらはなんとか成る...


ですがしかし,Kinectはマイクロソフト公式のSDKを使えばいいとして,Xtion Pro LIVEを使っている自分のような人はどうすればいいんですか???

2014年4月22日火曜日

Qtのproファイルで各OS向けに個別の設定をする

各OS向けQtの.proファイルの設定

Qtの.proファイルでは各OS向けに個別の設定を行うことが出来るみたいですね.クロスプラットフォームで開発する上で,それぞれのOS毎にインクルードパスやライブラリパスを設定できて便利です.

Windows向け

"win32"がWindows向けですね,例によって..
win32 {
# インクルードディレクトリの追加の例
INCLUDEPATH += c:/tbb/include
DEPENDPATH += c:/tbb/include

# ライブラリパスの追加の例(リリースビルド向け)
CONFIG(release, debug|release): LIBS += -Lc:/tbb/lib/intel64/vc10 -ltbb

# ライブラリパスの追加の例(デバッグビルド向け)
CONFIG(debug, debug|release): LIBS += -Lc:/tbb/lib/intel64/vc10 -ltbb_debug
}

Mac向け

Mac OS Xは"macx"と記述します.
macx {
# インクルードディレクトリの追加の例
INCLUDEPATH += /usr/local/Celler/tbb/4.2/include
DEPENDPATH += /usr/local/Celler/tbb/4.2/include

#ライブラリディレクトリの追加の例
LIBS += -L/usr/local/Celler/tbb/4.2/lib -ltbb
}

Unix/Linux向け

UNIXやLinux向けにはやはり"unix"と記述しますが,"unix"だけではMac OS Xでも適用されてしまうようなので,Macを除外するために"unix:!macx"とします
unix:!macx {
# インクルードディレクトリの追加の例
INCLUDEPATH += /usr/include
DEPENDPATH += /usr/include

#ライブラリディレクトリの追加の例
LIBS += -L/usr/lib -lxxxx
}

総括

Qtの.proファイルから各OSの統合開発環境のプロジェクトを作成できたり,makefileを作成できるので,CUIのアプリ開発もC++であればQtの.proファイルを軸に始めると便利だと思います..

2014年4月7日月曜日

QtプロジェクトからVisual StudioやXcodeのプロジェクトを作成

Qt .proファイルからIDEのプロジェクトファイルを作成

QtにはQt Creatorという開発環境があります.Qt Creatorでユーザーインターフェイスのデザインからアルゴリズムコーディングまでの全てを実装することも出来ますが,私は,Qt CreatorでQtプロジェクトの作成と設定のみを行い,その後はWindowsではVisual Studio,MacではXcodeなど使い慣れた統合開発環境で開発を行っています.Qt CreatorではかんたんにQtに関する設定が出来る上,クロスプラットフォームである利点を活かせるからです.

まずはQt CreatorでQtプロジェクトを作成する

.proファイルが作成されていますね.ここで依存ライブラリなどの設定も行います.

インクルードパスを追加 (Windows/Macそれぞれで)

INCLUDEPATHとDEPENDPATHにインクルードするためのディレクトリへのパスを追加します
# Windows向けにincludeディレクトリを追加する例
win32: INCLUDEPATH += C:/OpenCV/opencv-2.4.6/build/x64/vc10/include
win32: DEPENDPATH += C:/OpenCV/opencv-2.4.6/build/x64/vc10/include

# Mac向けに追加する例
macx:INCLUDEPATH += /usr/local/Cellar/opencv/2.4.6.1/include
macx:DEPENDPATH += /usr/local/Cellar/opencv/2.4.6.1/include

依存ライブラリを追加 (Windows/Macそれぞれで)

LIBSに"-Lライブラリのディレクトリへのパス", "-l追加するライブラリファイル"で追加するわけですね.
# Windows向けに追加する例(1行目がリリースモード,2行目がデバッグモード)
win32: CONFIG(release, debug|release): LIBS += -LC:/OpenCV/opencv-2.4.6/build/x64/vc10/lib/ -lopencv_core246 -lopencv_highgui246 -lopencv_imgproc246
else: win32:CONFIG(debug, debug|release): LIBS += -LC:/OpenCV/opencv-2.4.6/build/x64/vc10/lib/ -lopencv_core246d -lopencv_highgui246d -lopencv_imgproc246d

# Mac向けに追加する例
macx: LIBS += -L/usr/local/Cellar/opencv/2.4.6.1/lib/ -lopencv_core -lopencv_highgui -lopencv_imgproc

ビルド時のシンボルを定義

ビルド時のシンボルも定義してみます.
# デバッグビルド時は_Debugを定義する
CONFIG(debug, debug|release): DEFINES += _Debug

Visual Studioのプロジェクトを生成

Qtプロジェクトファイル(.pro)があるディレクトリにて次のコマンドを実行します.
# Visual C++ 2010
$qmake -spec win32-msvc2010 -tp vc

# Visual C++ 2012
$qmake -spec win32-msvc2012 -tp vc

Xcodeプロジェクトを生成

Qtプロジェクトファイル(.pro)があるディレクトリにて次のコマンドを実行します.
$qmake -spec macx-xcode

総括

Qt CreatorでQtプロジェクトの作成・設定を行ってqmakeコマンドを使って各統合開発環境のプロジェクトファイルを作成しました.クロスプラットフォームで使い慣れたツールを使って開発をするときに便利だと感じています.

2014年4月2日水曜日

JavaScript + jQuery + CSS で画像を適正サイズに切り取って中央配置する

JavaScriptで画像のトリミング

HTMLやCSSのwidth, heightプロパティを用いれば画像の表示サイズが設定できるのは言うまでもありませんが,画像の伸縮はそのままで画像を切り取ることでサイズ調整を行います.どんなサイズの画像でも指定したサイズに中央を残して切り取れるようにしました.

サンプル


内容

HTML

切り取り対象の画像にはonLoadにあとで作成するclipImageFitSize()関数を実行するように設定します.
<h2>元画像</h2>
<div><img src="image.jpg" alt="Source Image"></div>

<h2>切り取り後</h2>
<div class="container">
<img src="image.jpg" alt="Trimmed Image" onLoad="clipImageFitSize(this,
240, 200, 'center', 'middle')">
</div>

CSS

JavaScriptからCSSのclipプロパティを設定することで切り取りを実現するため,画像タグimgはpositionプロパティをabsoluteにする必要があります.
div.container img {
    /** absoluteに設定する必要がある.  */
    position: absolute;
}

JavaScript

JavaScriptではjQueryを使用します.jQueryからclipプロパティの値を設定します.clipプロパティについてはTag Indexの該当ページでわかりやすく解説されています.対象画像のサイズを取得して,トリミングする領域を算出しています.
<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript">
/**
* 画像を指定のサイズになるように切り抜るCSSを付与します.画像はposition: absoluteで無ければイケません.
* @param image {Object} 対象となる画像要素
* @param width {Number} 切り取り後の横幅
* @param height {Number} 切り取り後の縦幅
* @param positoinX 切り取り開始位置X(値,もしくは文字列left, center, right)
* @param positionY 切り取り開始位置Y(値,もしくは文字列top, middle, bottom)
*/
var clipImageFitSize = function(image, width, height, positionX, positionY) {
 var top, left, right, bottom;
 if(typeof(positionX) == "Number") {
  left = positionX;
  right = width + positionX;
 } else if(positionX == "left") {
  left = 0;
  right  = width;
 } else if(positionX == "center") {
  left = image.width / 2 - width / 2;
  left = (left < 0 ? 0 : left);
  right = left + width;
 } else if(positionX == "right") {
  left = width;
  right = 0;
 }

 if(typeof(positionY) == "Number") {
  top = positionY;
  bottom = height + positionY;
 } else if(positionY == "top") {
  top = 0;
  bottom = height;
 } else if(positionY == "middle") {
  top = image.height / 2 - height / 2;
  top = (top < 0 ? 0 : top);
  bottom = top + height;
 } else if(positionY == "bottom") {
  top = height;
  bottom = 0;
 }
 right = (right > image.width ? image.width : right);
 bottom = (bottom > image.height ? image.height : bottom);
 var cssStr = "rect(" + String(top) + "px " + String(right) + "px " + String(bottom) + "px " + String(left) + "px)";
 $(image).css("clip", cssStr);
 $(image).css("left", String(-1 * left) + "px");
 $(image).css("top", String(-1 * top) + "px");
 moveToCenter(image);
}
最後のmovoToCenter()関数で画像が親要素の中央に来るように調整します.
/**
* 要素を親要素の中央に配置します.position: absoluteで無ければイケません.
* @param element {Object} 対象のオブジェクト
*/
var moveToCenter = function(element) {
 var parent = $(element).parent().get(0);
 var left = $(parent).width() / 2 - $(element).width() / 2;
 var top = $(parent).height()  / 2 - $(element).height()  / 2;
 $(element).css("left", left);
 $(element).css("top", top);
}

予めトリミングした画像を用いれば,これを実装する必要はありませんが,元サイズの分からない画像をクライアント側でトリミングするときに使うことにします.
それでは..


2014年4月1日火曜日

テストのために,DebianにWordpressをセットアップしてみた.

Raspberry Pi上のDebian Linux

現在,私はRaspberry Pi上でDebian Linuxを稼働させています.お手頃価格で省エネで良いと思っています.
さて,そんなDebianで,Apache + PHP5 + MySQL をベースにしてWordpressをセットアップしてみました.公開用ではなく,Webサイトのテスト用であったため通常の80番ポートではなく,81番ポートでの運用のために設定を行いました.
至って普通のやり方であるため特に新規性はありませんのであしからず..

要項

  • バックエンドにApache2, MySQL
  • 81番ポートでの運用
  • /var/www81/wordpressに設置
  • http://localhost:81/wordpressのURLアクセス

必要事項のインストール

apt-getで必要な物をまずインストールしました.私の環境下では既にapache2とmysqlはインストール済みであったため,PHPのインストールです.
sudo apt-get install php5 php5-mysql

もし,apache2やmysqlがインストール済みでなければ併せてインストールする必要があります.
sudo apt-get install apache2 mysql mysql-server
なお,Apache2やMySQLの基本的な初期設定については,ここでは割愛します.

Apacheの設定

80番ポートではなく,81番ポートに設置するためVirtual Hostで81番向けのサイトを設定しました.
まず,公開用のファイルを設置するディレクトリを作成します.ついでにパーミッションも設定しました.
sudo mkdir /var/www81
sudo chown www-data:www-data -R /var/www81
sudo chmod g+w -R /var/www81

/etc/apache2/sites-avairableに次のようなファイルを作成しました.ファイル名はとりあえずdefault-81にしました.
Listen 81
<VirtualHost *:81>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www81
        <Directory />
                   Options FollowSymLinks
                   AllowOverride None
        </Directory>
        <Directory /var/www81/>
                Options Indexes FollowSymLinks MultiViews ExecCGI
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error81.log
</VirtualHost>
Options にExecCGIを記述してCGIの実行を許可していています.
Apache2に81番ポートのVirtualHostを有効化して,リセットします.
sudo a2ensite default-81
sudo service apache2 restart

MySQLの設定

管理者権限でMySQLにログインして,データベースを作成します.データベースの文字コードはUTF-8になっています.
mysql> create database wordpress_db;

Wordpressのインストールと設定

ターミナルから

Wordpressをダウンロードして,解凍,該当ディレクトリに設置(インストール)します.今回は/var/www81/wordpressとしました.
wget http://wordpress.org/latest.tar.gz
tar -xvzf latest.tar.gz
mv wordpress /var/www81
tarコマンドで展開するとwordpressディレクトリが現れます.それを/var/www81にコピーしました.今回はディレクトリ名をwordpressのままにしましたが,適宜好きな名前に変えましょう.
それではwordpressの設定を行います.設定ファイルのサンプルから設定ファイルwp-config.phpを変更します.
cd /var/www81/wordpress
cp wp-config-sample.php wp-config.php
emacs wp-config.php # 好きなエディタで開く
wp-config.phpを次のように変更します.
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress_db');

/** MySQL database username */
define('DB_USER', '#ユーザー名');

/** MySQL database password */
define('DB_PASSWORD', 'パスワード');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
データベース名(DB_NAME)やユーザー名,パスワードなどは適宜変えてください.
次の” Authentication Unique Keys and Salts.”の項目は,秘密鍵を登録するようですね.https://api.wordpress.org/secret-key/1.1/salt/ で鍵を作成できるようですので,これをそのままコピーしておきましょう.

Webブラウザから

インストールを完了させるために,http://サーバのアドレス:81/wordpress/wp-admin/install.phpにアクセスしましょう.:81は81番ポートだからですね.
こんなページが現れました.
サイトのタイトル,ユーザー名,パスワード,メールアドレスを入力して次に行きましょ,これでインストールは一旦完了のようです.

わかりやすいWikiを参考に

基本的にここの焼き直しになってしまいましたが...
http://wpdocs.sourceforge.jp/WordPress_のインストール