cv::SurfDescriptorExtractorの拡張ディスクリプタを無効にする

魚類というのは分類学的にどうなるのか調べてみたら,昔は「綱」だったけどそうも言えないことがわかって,今は魚類をひっくるめた分類というのはない(生物学的には意味がなくなってしまう)んだそうですね.

さて,局所特徴量のSURFと言うと64次元だよね!という認識が一般的だと思います.
実際には原著(*1)の段階から特徴量を128次元で記述する拡張ディスクリプタ(extended descriptor)についても言及されていて,OpenCVの実装ではSURF特徴記述を行うcv::SurfDescriptorExtractorにおいてデフォルトで有効となっています.

cv::SurfDescriptorExtractor extractor;
std::cout << extractor.descriptorSize() << std::endl;  //128と出力されます

本来の64次元で使うには,特徴記述処理を行う前にこれを無効にします.
SurfDescriptorExtractorのコンストラクタのextendedをfalseにすればおkなんですが,
ぐぐって見つかるリファレンスでは最新のバージョンに同期されてなくて,でもコンパイルは通るので一瞬困惑します.

コンストラクタで指定するよりは,

cv::SurfDescriptorExtractor extractor;
extractor.extended = false;
std::cout << extractor.descriptorSize() << std::endl;  //64と出力されます

とすれば,その他のコンストラクタの他のデフォルトはそのままにいけます.少し汚いですが.

*1: H.Bay et. al., “Speeded-Up Robust Features (SURF),” ECCV2006

ssh -Xでevinceが動かない場合の対処

ぶっちゃけるとわりと最近までそれほど魚食べるのは好きじゃなかったんですね.
でも魚キャラを2年かそこらくらいやってて,自分の中に変化が….
というわけでお魚食べたいです.お魚.

さて,sshのX転送は便利でよく使わしてもらってるんですが,アプリによっては特有のエラーで使えなかったり.

Ubuntu系ディストロにて標準で使えるevince(PDFのドキュメントビューア)もそんなアプリの一つで,ssh -Xで普通に実行すると次のようなエラーが出ます(ちゃんと環境変数設定してても).

% DISPLAY=localhost:10.0 evince hogehoge.pdf
(evince:xxxxx): EggSMClient-WARNING **: Failed to connect to the session manager: None of the authentication protocols specified are supported
                Cannot parse arguments: ディスプレイをオープンできません:

ぐぐると,日本語の情報はあんま見つかんなかったのですが,
My Meaningless Scribbles …: Evince would not start over SSH X-forwarding
で解決法が紹介されました.エラーメッセージだけでぐぐるとこれは見つからなかったですね.
これしてからsshで入った先で,

% sudo ln -s /etc/apparmor.d/usr.bin.evince /etc/apparmor.d/disable
% sudo /etc/init.d/apparmor restart

を実行すると,他のアプリと同様にX転送してくれるようになって(゚д゚)ウマーです.

おっと論文書いてることバレるぞ(違

sshプロキシ設定

あけましておめでとうございます.
蛇年ですね.年男ですが,今年も魚でやっていきます.

さて,ラボのLAN内の自分のマシンに学外からsshで入りたいです.
そのためには,ラボのゲートウェイを超える必要があって,多段SSHをする必要があります.

家PCから,ラボGWにsshして,そこからラボPCにssh,これを,SSHプロキシ機能で一度にやってくれる設定.
いわゆるport forwardingではなくて,ncとかも不要で原理もわかりやすく設定もラクです.

基本的にはこのあたりを参考にしてるというかそのままです.
The Weight @northeye: sshコマンドだけで多段ログインする
あとこのやり方の手がかり?は@ton1517が教えてくれました.thx!

家PC,ラボGW,ラボPCどれもLinuxです.

家PCの自分のssh設定を記述します.$HOME/.ssh/configを編集してください.

  • 家PCホスト名: HOMEPC
  • ラボGWホスト名: LABGW (外から普通にsshできる完全な名前で)
  • ラボPCホスト名: LABPC
  • ラボPCに入るときのユーザ名: labgw_name
  • ラボGWに入るときのユーザ名: labpc_name

として,

% cat ~/.ssh/config
Host LABPC
    Hostname        LABPC
    User            labpc_name
    ProxyCommand    ssh labgw_name@LABGW -W %h:%p

ホスト名はIPアドレスでもおkです.

何段階かのGWを経る必要がある場合はHostのホスト名やプロキシ先を変えながら経由するGWの分だけ線形リストのように書き足して行けるようです.

これで,家PCにて

HOMEPC% ssh LABPC

でラボPCに一気につながります.ユーザ名修飾も不要で(゚д゚)ウマーです.
また,

HOMEPC% ssh -XY LABPC

としてXの転送もできて超(゚д゚)ウマーです.

以上,2013年最初の記事は完全に自分用メモでした.

私事ですが,こうしてラボ外からでも自由に研究できるようにしないとヤバい状況です.なんという年明け.
研究という名のエクストリームスポーツ.