Qt Creator で svn+ssh のリポジトリを扱う
svn+ssh でアクセスする Subversion リポジトリのワーキングコピーを扱う場合、 SSH の通信にパスワードが必要になる。
Qt Creator は、オプション→バージョン管理システム→概要タブの、 「SSH プロンプトコマンド」のコマンドを呼び出して、パスワード入力を促すのだが、デフォルトでは ssh-askpass という風になっていて、 Fedora などではこのコマンドが入っていないと動かない。
Fedora では、 openssh-askpass
パッケージに含まれる、/usr/libexec/openssh/ssh-askpass
を指定すればよい。なお、このコマンドのディレクトリはパスが通っていないので、フルパスで指定しないといけない。
SSH の config のパーミッションエラーを解決する
Cygwin でファイルを作成すると、グループが "なし" になる。で、この状態だとグループのパーミッションが rw となって、これを消すことができない。つまり、 chmod g-rw をしても無視される。
~/.ssh/config はユーザ以外のパーミッションを無しにしなければならないのだが、これだとエラーとなって困ってしまう。
解決するには、グループを Users
にする。
$ chgrp Users ~/.ssh/config $ chmod 600 ~/.ssh/config
関連サイト: Using Cygwin in Windows 8, chmod 600 does not work as expected? - Super User
■
面接官「特技は高階グラフカットとありますが?」
ASK君 「はい。高階グラフカットです。」
面接官「高階グラフカットとは何のことですか?」
ASK君 「3つ以上のボクセルからなるクリークに依存するエネルギー最小化です。」
面接官「え、クリーク?」
ASK君 「はい。クリークです。クリークの配置が複雑な臓器の配置を表現します。」
面接官「・・・で、その高階グラフカットは当社において働くうえで何のメリットがあるとお考えですか?」
ASK君 「はい。多臓器の領域分割ができます。」
面接官「いや、当社には分割したい臓器などありません。それに人に危害を加えるのは犯罪ですよね。」
ASK君 「でも、Potts エネルギーにも勝てますよ。」
面接官「いや、勝つとかそういう問題じゃなくてですね・・・」
ASK君 「3階以上のエネルギーは1階に還元できるのです。」
面接官「ふざけないでください。それに高階って何ですか。だいたい・・・」
ASK君 「階数は依存するボクセルの数-1です。クリークのボクセル数そのものは次数とも言います。高階というのは・・・」
面接官「聞いてません。帰って下さい。」
ASK君 「あれあれ?怒らせていいんですか?使いますよ。QPBO。」
面接官「いいですよ。使って下さい。QPBOとやらを。それで満足したら帰って下さい。」
ASK君 「運がよかったな。今日はメモリが足りないみたいだ。」
面接官「クリーク数多いよ。」
colorize
colorize は、 fill で指定した色を指定した比率で画像全体にアルファブレンドする。
各チャンネルごとに比率をわけることもできる。
値は、単位を省略すると % になるらしい。
$ convert in.png -fill red -colorize 50% out.png # 全体に赤みが付く $ convert in.png -fill white -colorize 50% out.png # 全体が白っぽくなる $ convert in.png -fill black -colorize 50% out.png # 全体が暗くなる $ convert in.png -fill gray50 -colorize 70% out.png # スモークのかかったようになる $ convert in.png -fill red -colorize 0,100,100 out.png # B,G が 0 になる
Mat_ の (本当の) 罠
id:DOSEI:20130306:p1 の訂正記事。のつもりだったけど、まだ理解が不十分だったので以下の文章は治す予定。うのむな。
まとめ
cv::Mat_
を関数の引数の型にしてはいけない。
理由
cv::Mat_
は、 cv::Mat
の型を固定した薄いラッパーです。 Mat は任意の型を持てるのだが、メンバ関数 at()
などには(通常は正しい)型を指定しなければならない。しかし、あらかじめ型が既知なら、 Mat_ を使うと、その指定が省略できたり、コンストラクタが簡単になったりする。
関数の引数で Mat を受け取ったら、まずは型などを調べて、 Mat_ でラップすればいい。
void f(Mat const& _M) { assert(M.type() == CV_8UC1); Mat_<unsigned char> M = _M; // M を安全に使う }
以下のコードだと、型に合わせて変換される。変換の要不要で、もとのインスタンスのクローンになるかが異なるため、わかりづらい。
Mat_::type() は、ラップしてる型を常に返すので、 Mat_ でラップするともともと何の型だったかを調べることが不可能になる。
void f(Mat_<unsigned char> const& M) // !! 変換が不要ならインスタンスそのものがそのまま、必要なら新しいインスタンスが生成・変換されて渡される。 { assert(M.type() == CV_8UC1); // !! 常に真 // M は、呼び出し元で見ているデータを書き換えているかがわかりづらい。 }