Mac上のQtCreatorでGCC4.9でコンパイルする

gcc4.9でコンパイルをしようとしたのに何度やってもgcc4.2でコンパイルされてしまい
だいぶハマッたのでメモ.

事前に,gcc4.9とgdbがbrewでインストールされているとする.

brew tap homebrew/versions
brew install gcc49
brew install gdb

設定は,Command-,で設定画面を開き,右の追加ボタンからgccを選択.
赤枠の部分を埋めて,OKを押す.
設定

この時,mkspec:で指定した項目が存在しないので,それを作る.
ターミナルを開き,既存の古いバージョンのspecからコピーし,qmake.confを編集する.
以下の例では,qt5の5.3.0を使っているが,qt4ならば,qt5/5.3.0の部分をqt/(バージョン番号)に置き換える.

cd /usr/local/Cellar/qt5/5.3.0/mkspecs
cp -r macx-g++42 macx-g++49
cd macx-g++49
vim qmake.conf

変更箇所は,QMAKE_CCとQMAKE_CXX.あとついでにQMAKE_MACOSX_DEPLOYMENT_TARGETも変えておく.

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9

QMAKE_CC                = gcc-4.9
QMAKE_CXX               = g++-4.9

LEMON Graph LibraryをMacで使う(成功)

先日書いた記事では,LEMON Graph Libraryをhomebrewでインストールしようとしてうまくいかないという話だった.

今回,うまく行ったのでメモ.

手順としては,gccの新しいやつをいれ,それを使ってlemon-graphを入れれば良い.
lemonはgccの新しいやつでないとコンパイルが出来ないらしい.

まず,gccのインストールは

brew tap homebrew/versions
brew install gcc49

これでgccの4.9が使えるようになる.
そして,次はlemon-graphをgccを使って入れる.
ここでは, --interactive オプションが重要.

まず,COINORのリポジトリを追加して,

brew tap dpo/homebrew-coinor
brew install lemon-graph --interactive

これを実行すると,シェルに戻ってくる.
ここで,手動でビルドしてインストールすれば良い.
lemonのバージョンが1.3でgccが4.9の場合

cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc-49 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-49 -DCMAKE_INSTALL_PREFIX=/usr/local/Cellar/lemon-graph/1.3
make
make install
exit

することで,brewによるインストールが完了し,元のシェルに戻る.
これで無事LEMON Graph Libraryが使えるようになった.

cv::OutputArrayの使い方(効率悪い)

今日は,cv::InputArray/cv::OutputArrayを入出力とする簡単な関数の作り方.

はじめ使い方がよくわからなかったので効率の悪い使い方をしていた.
まずはそれの紹介から.

例えば,全要素に1足す関数 plus1(cv::InputArray in, cv::OutputArray out) を作るとする.

void plus1(cv::InputArray in, cv::OutputArray out){
    cv::Mat img=in.getMat();
    cv::Mat pls=img+1;
    pls.copyTo(out);
}

cv::OutputArrayには直接代入が出来ないので,copyToを使ってコピーしていた.
ただし,処理の最後にOpenCVに入っている関数を呼び出すのであればこれで良い.
例えば

void fliteredplus1(cv::InputArray in, cv::OutputArray out){
    cv::Mat img=in.getMat();
    cv::Mat pls=img+1;
    cv::medianBlur(pls, out, 3);

こんな感じであれば問題ない…と思う.

で,正しい(最後にOpenCVの関数を呼び出さない場合の)使い方は次回.

やっぱりダメかも

昨日RAIDが死んで,色々やった結果復活したと思ったが,やはりいくつかファイルが壊れていたようだ.

特に痛いのが,RAID上に作った大きな仮想マシン用ディスクイメージ.
どうやらこれがダメージを受けていたようで,仮想マシンのファイルシステムがおかしくなっていた.

gitのリポジトリ内のファイルがおかしくなっていたのは痛い.
仕方ないのでマウントを外した上で fsck をかけてみている.

RAIDが死んでも一旦挿しなおしてみよう

今日RAID 6で運用しているRAIDのHDDが3つ同時にエラーランプ点灯した.
RAID 5ではHDDが2台同時に壊れたらアウト,RAID 6では3台同時に壊れたらアウトなので,かなり焦ったが,一旦取り出して挿し直したら復活…(?)

一応データは大丈夫っぽいけど,念の為にバックアップを取って,エラーが出てたHDDを取り替えて再構築しよう.

しかし容量が大きすぎてバックアップ取るのに時間がかかる….

cv::InputArrayの使い方

前回,cv::InputArray/cv::OutputArrayについて書いたが,今回はcv::InputArrayを入力とする関数の作り方について書く.

cv::InputArrayで受け取ったものは,中身はcv::Matやstd::vectorだがそのままでは使えない.
cv::InputArrayのkind()という関数を使うことで,もともと何型だったのかを知ることができる.
使えるのは,
MAT
MATX
STD_VECTOR
STD_VECTOR_VECTOR
STD_VECTOR_MAT
EXPR
OPENGL_BUFFER
OPENGL_TEXTURE
GPU_MAT
OCL_MAP

使うときは,cv::InputArrayクラスのgetMat()やgetMatVector()を呼び出し,cv::Matやstd::vector型に変換して使う.

void showImg(cv::InputArray in){
    cv::Mat img=in.getMat();
    // 以降,元がstd::vectorだろうとcv::Matとして使える
    cv::imshow("img",img);
    cv::waitKey();
}

getMatVector()の方は,cv::Matの配列になるので,

void printImgs(cv::InputArray in){
    std::vector<cv::Mat> imgs;
    in.getMatVector(imgs);
    for(auto img: imgs){
        std::cout << img << std::endl;
    }
}

という感じで使える.上記関数にcv::Matを渡すと,各行からなるcv::Matが配列に格納され,行ごとに画面に出力される.

cv::InputArrayとcv::OutputArray

OpenCVの新しいバージョン(3.0)では,様々なところで変更があって,いろんなアルゴリズムが入出力としてcv::InputArrayとcv::OutputArrayを使うようになっている.

cv::InputArray/cv::OutputArrayは,std::vectorやcv::Matやstd::vectorなどを統一的に扱えるようにしたもの.

なので,例えば cv::threshold だと,cv::Matを入力として

cv::Mat img, out;
cv::threshold(img, out, 10, 255, cv::THRESH_BINARY);

このように使ったり,std::vectorを入力として

std::vector<double> img;
cv::Mat out;
cv::threshold(img, out, 10, 255, cv::THRESH_BINARY);

このように使うことができる.

また,受け取る側のcv::OutputArrayも同様なので,先ほどの例だと受け取る側を

cv::Mat img;
std::vector<unsigned char> out;
cv::threshold(img, out, 10, 255, cv::THRESH_BINARY);

のようにstd::vectorにしたりもできる.

次回はこのようなcv::InputArray/cv::OutputArrayを入出力とする関数を自作する方法について書く.

部屋の掃除

最近掃除したいと思っているベランダ.
今日はとりあえずずっと放置していたダンボール箱を片付けた.

今度箒で掃いて,水流して洗おう.

ノマド部活動報告

今日は茨木市での開催.朝10時開始,夜23時解散,参加者3名.

まずは朝からモスバーガー阪急茨木店でのまど.
茨木市駅周辺の方向感覚がなくて着くまで迷ったけど.

ここはしっかり分煙されているので良い.電源はなし.

昼ごはんはラーメン.
目的の店が定休日だったので急遽,麺や七へ.
チャーハンと醤油ラーメンのセットを食べた.

午後からの目的地が混んでいたため電源の使える場所を求めてさまよった.
結果…カラオケJOYJOY阪急茨木駅店へ.
フリードリンクで電源も確保できてBGMも自由に選曲できて良かった.

そして目的のCafe co*machiへ.
電源のある席を用意して頂いてひたすら作業.
本日のシフォンケーキが美味しかった.

時間があったので更にもうひとのまど.
JR茨木駅の方へ移動してcafe百花へ.
古民家を改装したお店で雰囲気が良かった.
カフェモカは無かった.

打ち上げはジョニーのからあげ茨木神社前店
たまたま開いていたお店にふらっと入店.
唐揚げのテイクアウトもできるお店.
ビールと唐揚げでカンパイ.

締めは茨木音楽祭へ.
メインステージ最後のorange pekoeのライブを観た.

オレンジ・ペコーはこれしか知らなかった…