OpenCV2.3のインストールでハマった話

OpenCV2.3のPythonバインディングはnumpyが入っている必要があるっぽい。

うちの環境では/opt以下にPython(2.6, 2.7)を入れてvirtualenvで切り替えているのですが、numpyはいつもvirtualenv下のpipで入れていました。
今回、OpenCV2.3環境が必要になったので2.2と同じようにインストールしていたら、Pythonバインディング用のcv.soが生成されない。

# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/opencv2.3.1 -D BUILD_NEW_PYTHON_SUPPORT=ON -D PYTHON_EXECUTABLE=/opt/python2.6/bin/python -D PYTHON_LIBRARY=/opt/python2.6/lib/libpython2.6.so -D PYTHON_INCLUDE_PATH=/opt/python2.6/include/python2.6 .
...
--   Interfaces:
--     Python:                     YES
--     Python interpreter:         /opt/python2.7/bin/python -B (ver 2.6)
--     Python numpy:               NO (Python wrappers will not be generated)
...

numpyを入れる必要があるらしい。
#あとで確認してみたら2.2では Python numpy: NO (Python interface will not cover OpenCV 2.x API) になっていました。
#こちらはnumpyなしでもcv.soは生成されます。

numpyを入れるが、ここでまたハマる。

numpyをソースから入れようとするも上手くコンパイルできない。
仕方がないのでeasy_installから入れようとするもこれもエラー。

# yum install gcc-gfortran
# /opt/python2.6/bin/easy_install numpy
...
/usr/bin/ld: cannot find -lpython2.6
...

-lpython2.6がないと言われる。

# ldconfig -p || grep python2.6
	libpython2.6.so.1.0 (libc6,x86-64) => /opt/python2.6/lib/libpython2.6.so.1.0
	libpython2.6.so (libc6,x86-64) => /opt/python2.6/lib/libpython2.6.so

ちゃんとリンクはされているはず。
悩んだ末、

# export CFLAGS=-L/opt/python2.6/lib/
# /opt/python2.6/bin/easy_install numpy

でインストールできた。正しい解決方法があったら教えてください。

なお、easy_installでインストールしたモジュールのアンインストールはこちらが参考になります。
pythonモジュールのアンインストール

OpenCVに戻る。

# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/opencv2.3.1 -D BUILD_NEW_PYTHON_SUPPORT=ON -D PYTHON_EXECUTABLE=/opt/python2.6/bin/python -D PYTHON_LIBRARY=/opt/python2.6/lib/libpython2.6.so -D PYTHON_INCLUDE_PATH=/opt/python2.6/include/python2.6 .
...
--   Interfaces:
--     Python:                     YES
--     Python interpreter:         /opt/python2.6/bin/python -B (ver 2.6)
--     Python numpy:               YES
...
# make
# make install
# ls /opt/opencv2.3.1/lib/python2.6/site-packages/ | grep cv
cv.py
cv2.so

できました。

なんでOpenCV2.3とPython2.6の組み合わせかっていうと、
開発環境のMacでHomebrewから入れたOpenCV2.3がPython2.6(Macデフォルト)になっていたため。
HomebrewでPython2.7も入れているので、こっちに対応させる方法もあるのだろうけども。

css-modeの中括弧

css-mode(cssm-version "0.11")を普段使っているのですが、中括弧挿入時の挙動が気に入らない。
中括弧挿入時に改行設定してるのですが(setq cssm-newline-before-closing-bracket t)、半角スペースが入り込むんですよね。

( _ はカーソル位置です。)

hoge { _
}

こうなってほしい。

hoge {_
}

なので、css-mode.elを少し変更しました。

(define-skeleton cssm-insert-curlies
  "Inserts a pair of matching curly parenthesises." nil
  ;; "{ " _ (if cssm-newline-before-closing-bracket "\n" " ")
  ; cssm-newline-before-closing-bracket の挙動を変更
  "{"
  (if cssm-newline-before-closing-bracket "" " ")
  _
  (if cssm-newline-before-closing-bracket "\n" " ")
  "}")
/* cssm-newline-before-closing-bracket t */
hoge {_
}

/* cssm-newline-before-closing-bracket nil */
hoge { _ }

となります。うれしい。

ついでに。init.elの設定はこんな感じです。

(setq indent-tabs-mode nil)
(setq-default indent-tabs-mode nil)
(setq default-tab-width 4)
(setq tab-width 4)
(setq-default tab-width 4)
...
;; css-mode
(autoload 'css-mode "css-mode" nil t)
(setq auto-mode-alist
      (cons '("\\.css\\'" . css-mode) auto-mode-alist))
(add-hook 'css-mode-hook
          '(lambda ()
             (setq cssm-indent-level 4)
             (setq cssm-indent-function #'cssm-c-style-indenter)
             (setq cssm-newline-before-closing-bracket t)
             ))

参考

css-modeのカーソル位置修正
http://d.hatena.ne.jp/hara_masa/20110306/1299374607

プロ生HTML5@大阪に行ってきました

HTML5 プログラミング生放送勉強会 第11回@大阪に行ってきました。
http://pronama.wordpress.com/2011/10/25/pronama-11-at-osaka/

ブログを書くまでが勉強会だ、ということらしいので感想(というよりメモ)など。
下書き状態で放置して遅くなってしまった。

Windows 8とMetro Style App : @jz5さん

  • とにかくWIndows 8の動きがかっこよかった
  • Metro Style AppはAndroid/iOSをTitaniumで作る感じに似ていた気がする
  • Expression Blendすげー。Winアプリつくるならちょっと欲しいと思った

Project Silk : @shinsukeodaさん

  • モダンブラウザのためのWebアプリ開発ガイダンス
  • VS Express Editionでも一応動く。赤い文字に負けない
  • まだ個人でしか開発したことないからあんまりピンと来なかったけど、そのうち必要になるんだろうなーと思いながら見てた

PythonでWebSocket : @naoinaさん

  • Web Socket便利そう
  • これを使ってなにか作りたくなった

Sencha Touch : @tworksさん

  • JSを使ったスマフォ用UIのWebアプリ開発フレームワーク
  • ネイティブアプリ似のUI/UX表現ができる
  • デザイナが動きの部分を説明するのに使えそう
  • サンプル Kitchen Sink

Web Matrix 2とIE10 : @osamum_MSさん

  • Wordpressのようにカスタマイズでもって開発する
  • インテリセンスすごい。普段補完はほとんど使わないんだけど、これは使ってみたいと思った
  • ウェブマトリクスマンがじわじわきた
  • IEに開発ツールがあるのは知らなかった。きっと使わない

LT

GroovyでHTML5生成 : @linerlockさん
  • ブラウザでのプレゼンはページ指定で飛ぶ機能があんまない印象
  • Groovyちゃんマジ便利
enchant.jsでゲーム作成 : @kyubunsさん
NoSQL : @nakajiさん
  • NoSQLあんまわからない
開発手法 : @black__seさん
  • 開発行程なんかの?話
  • この手の話はまだよくわからない


全体的に感じたのは、ああJSは必須だなあということでした。
ちゃんと勉強しないとダメですね。

こういうオープンな勉強会は初めてだったのでドキドキでしたが、楽しかったです。
モチベも上がるし、どんどん参加していきたい。

CvMatについて

公式リファレンス(2.2)でCvMat使ってたので、Pythonから使うときはCvMatの方が良いの?
という感じでCvMatの仕様を調べてみる。
# Numpyと連携ができるから、とかかもしれない

要素

type

型。CreateMatなどで指定するCV_8UC3なんかの値。

rows

行数。height。

cols

列数。width。

step

完全な行の長さ。cols*チャンネル数?

わかんなくなったら

>>> print m

ピクセル

こんな感じに並んでる(イメージ)。
RGBじゃなくてBGRらしい。


ピクセルにアクセスするときは
m[rows, cols][channel]
みたいに。

>>> print m[0,0]
(128.0, 138.0, 225.0)
>>> print m[0,0][1]
138.0

チャンネル指定しなかったらタプルで返ってくる。
なぜかfloat。

参考

http://opencv.jp/opencv-2svn/py/


未だにIplImageとCvMatとcv::Matの使い分けがわかってない。

html-modeのキーバインド

Emacs23.3におけるhtml-modeのキーバインド一覧。
helpまんま。

C-c C-a         sgml-attributes            属性の挿入
C-c C-b         sgml-skip-tag-backward     前のタグ
C-c C-c         Prefix Command             プレフィックス
C-c C-d         sgml-delete-tag            タグの削除
C-c C-f         sgml-skip-tag-forward      次のタグ
C-c TAB         sgml-tags-invisible        タグの表示/非表示
C-c C-j         html-line                  <br>の挿入
C-c RET         html-paragraph             <p>の挿入
C-c C-n         sgml-name-char             文字実体の挿入
C-c C-s         html-autoview-mode         ファイル保存時に自動的にブラウザで表示
C-c C-t         sgml-tag                   タグの挿入
C-c C-v         browse-url-of-buffer       ブラウザで表示
C-c /           sgml-close-tag             タグの閉じる
C-c 1           html-headline-1            <h1>の挿入
C-c 2           html-headline-2            <h2>の挿入
C-c 3           html-headline-3            <h3>の挿入
C-c 4           html-headline-4            <h4>の挿入
C-c 5           html-headline-5            <h5>の挿入
C-c 6           html-headline-6            <h6>の挿入
C-c 8           sgml-name-8bit-mode        Latin-1文字実体の挿入
C-c ?           sgml-tag-help              タグの説明
C-c DEL         sgml-delete-tag            タグの削除
C-c <left>      sgml-skip-tag-backward     前のタグ
C-c <right>     sgml-skip-tag-forward      次のタグ

M-TAB           ispell-complete-word       タグの補完

C-c C-c -       html-horizontal-rule       <hr>の挿入
C-c C-c c       html-checkboxes            チェックボックスのグループの挿入(C-gで終了)
C-c C-c h       html-href-anchor           <a href="">の挿入
C-c C-c i       html-image                 <img src="">の挿入
C-c C-c l       html-list-item             <li>の挿入
C-c C-c n       html-name-anchor           <a name="">の挿入
C-c C-c o       html-ordered-list          <ol>の挿入
C-c C-c r       html-radio-buttons         ラジオボタンのグループの挿入(C-gで終了)
C-c C-c u       html-unordered-list        <ul>の挿入

EmacsでHTML書く人って少ないのかな……。
たしかにCodaとか便利そうではあるけれど。