Mac OS X 10.6 Snow LeopardにOpenCV2.2をインストールする(Pythonでの動画出力問題解決(?)付き)

皆様、OpenCV2.2がリリースされましたね。
巷では
MacPortsで簡単インストール!これで君も明日からOpenCVユーザー!
って感じで話題になってますね。
嘘を言うな!
…っていうのは冗談で自業自得でした、ハイ。

結局何が原因だったかというと、昨年ソースから頑張ってインストールしたOpenCV。
それが邪魔してMacPortsのインストール時にコケてたみたいです。
というわけで
Mac OS X 10.6 Snow Leopard でMacPortsを使ったOpenCVのセットアップ方法(MacPortsで入れたPythonも使えるようにする)
なんて記事を参考にOpenCVをインストールしてしまったそこのあなた!
まずは頑張っていれたOpenCVをアンインストールしましょう。

cd opencv/build
sudo make uninstall
でアンインストールしましょう。これでさっぱり綺麗になったはずです。

これでようやくMacPortsでのOpenCVのインストールが出来ます。
インストール方法は実に簡単。
sudo port selfupdate(MacPortsのPort情報を最新に)
sudo port install opencv +python26(PythonでOpenCV使わない場合はsudo port install opencvおんりー)
でインストールできるはずです。
いい時代になったもんだ。というか今までの苦労なんだったんだ。


Pythonの動画書き出しで変な動画ファイルが出力される
ナウなヤングにPython大人気じゃないですか。
でOpenCVでも使えるってんだから使わない手はないじゃないですか。
ということで昨年あたりからPythonベースで(Windowsで)OpenCVの色々なものつくってきたんですが、んじゃそろそろメインのMacでもやるべかということでやってみたらハマった。
とりあえずサンプルコードのcamera.pyを改造して、動画の出力をやったら
video
こんな感じでどうも動画がうまく保存されない。ウィンドウにはきちんと表示されてるので、カメラが原因でもない、さてなんのこっちゃということでOpenCVのメーリングリストに色々と投げてみたんですが、とりあえず自己解決。

Windowsでは必要なかった(はず)なんだけど、
hogeimage = cv.QueryFrame(hoge)
でとってきたイメージを
copyimage = cv.CreateImage(size, cv.IPL_DEPTH_8U, 3)
で作った構造体に
cv.Copy(hogeimage, copyimage)
って感じでコピーしてから
cv.WriteFrame(writer,copyimage)
って感じで書きこまなきゃいかんらしい。
(ここでwriterはcv.CreateVideoWriterで作ったやつ
これ解決するのに1週間費やしてしまった…まぁ当然といえば当然なんだけど、むしろなんで今までWindowsで動いてたんだろうか。
とりあえずここを参考にちょっと変えたサンプルコードを載せておく。
(参考元では、上手く動かなかったcv.WriteFrame(writer,hogeimage)でやってるけど、他の人はこれでも動くのかしらん)
import cv

if __name__ == "__main__":
    #カメラの設定
    cam = cv.CaptureFromCAM(0)
    #カメラの情報から解像度取得
    size = (int(cv.GetCaptureProperty(cam, cv.CV_CAP_PROP_FRAME_WIDTH)),
        int(cv.GetCaptureProperty(cam, cv.CV_CAP_PROP_FRAME_HEIGHT)))
    #ビデオライタの作成:出力設定
    writer = cv.CreateVideoWriter(
        "video.avi",
        cv.CV_FOURCC('P','I','M','1'),
        30,
        size)
    #空の画像イメージ作成
    copyimage = cv.CreateImage(size, cv.IPL_DEPTH_8U, 3)
    #録画開始
    while True:
        #カメラから画像を取ってくる
        hogeimage = cv.QueryFrame(cam)
        #hogeimageの内容をcopyimageにコピー
        cv.Copy(hogeimage, copyimage)
        #コピーしたイメージを書き出し
        cv.WriteFrame(writer, copyimage)
        #画像の表示
        cv.ShowImage("Cam", copyimage)
        #ESC押したら終了
        if cv.WaitKey(10) == 27:
            break

とりあえずここ数日喉に引っかかってる骨がとれた感じ。
めでたしめでたし