SyntaxHighlighter

2012-02-26

コンピュータビジョン勉強会ハッカソン

コンピュータビジョン勉強会ハッカソンに行ってきました。
みんな黙々と作業していたので、実質3人しかつぶやいていなかったらしいtogetterはこれ

自分は、C++版のOpenCVをちゃんと使った事無かったので、C++版を触ってみることにしました。
具体的に実施したのは、http://opencv.jp/のcookbookの画像処理の部分をちょこちょこ覗きつつ、最終的にtemplate matchingの項をほぼ写経してみました。
template matchingの結果(類似度のマップみたいなもの)と、オリジナル画像に一致した場所を表示したもの結合画像はこれを参照にしてます。
下記のコードになります。C++的にこういう書き方が良いのか分かりませんが。

#include <opencv2 core.hpp="" core="">
#include <opencv2 imgproc.hpp="" imgproc="">
#include <opencv2 highgui.hpp="" highgui="">
#include <iostream>

cv::Mat mouseMat;
void onMouse(int event, int x, int y, int flag, void*) {
    if ((x < 0 && mouseMat.size[0] < x) || (y < 0 && mouseMat.size[0] < y)) {
        return;
    }
    switch (event) {
        case cv::EVENT_LBUTTONUP:
            switch (mouseMat.channels()) {
                case 3: {
                    uchar b = mouseMat.at<cv::vec3b>(y,x)[0];
                    uchar g = mouseMat.at<cv::vec3b>(y,x)[1];
                    uchar r = mouseMat.at<cv::vec3b>(y,x)[2];
                    std::cout << "(" << y << "," << x << ")" << int(r) << ":" << int(g) << ":" << int(b) << std::endl;
                    break;
                }
                case 1: {
                    uchar gray = mouseMat.at<uchar>(y,x);
                    std::cout << "(" << y << "," << x << ")" << int(gray) << std::endl;
                    break;
                }
            }
            break;
    }
}

void viewImage(cv::Mat img, std::string title) {
    mouseMat = img;
    cv::namedWindow(title, CV_WND_PROP_AUTOSIZE|CV_WINDOW_FREERATIO);
    cv::imshow(title, img);
    cv::setMouseCallback(title, onMouse, 0);
    while (1) {
        int key = cv::waitKey(0);
        if (key == 27) break;
    }
}

cv::Mat loadimage(std::string name, int flag=1) {
    cv::Mat image = cv::imread(name, flag);
    if (image.empty()) {
        std::cout << "can not open file " << name << std::endl;
        exit(1);
    }
    return image;
}

void templateMatching(std::string searchfile, std::string templatefile, std::string outputfile) {
    cv::Mat searchimg_orig = loadimage(searchfile);
    cv::Mat templateimg_orig = loadimage(templatefile);
    
    cv::Mat searchimg;
    cv::Mat templateimg;
    
    double s_factor = 320.0 / searchimg_orig.cols;
    cv::resize(searchimg_orig, searchimg, cv::Size(), s_factor , s_factor);
    cv::resize(templateimg_orig, templateimg, cv::Size(), s_factor, s_factor);
    
    cv::Mat resultimg;
    cv::matchTemplate(searchimg, templateimg, resultimg, CV_TM_CCORR_NORMED);
    
    cv::Rect answer(0,0,templateimg.cols, templateimg.rows);
    cv::Point max_point;
    double maxValue;
    cv::minMaxLoc(resultimg, NULL, &maxValue, NULL, &max_point);
    answer.x = max_point.x;
    answer.y = max_point.y;
    cv::rectangle(searchimg, answer, cv::Scalar(0,0,255), 3);

    cv::Mat combined_img(cv::Size(searchimg.cols + resultimg.cols, searchimg.rows), CV_8UC3, cv::Scalar(0,0,0));
    cv::Rect roi_rect;
    roi_rect.width = searchimg.cols;
    roi_rect.height = searchimg.rows;
    cv::Mat roi(combined_img, roi_rect);
    searchimg.copyTo(roi);
    roi_rect.x += searchimg.cols;
    cv::Mat resultimg_3c;
    cv::Mat tmp_img;
    cv::convertScaleAbs(resultimg, tmp_img, 255);
    cv::cvtColor(tmp_img, resultimg_3c, CV_GRAY2BGR);
    roi_rect.width = resultimg_3c.cols;
    roi_rect.height = resultimg_3c.rows;
    cv::Mat roi2(combined_img, roi_rect);
    resultimg_3c.copyTo(roi2);
    
    //viewImage(resultimg_3c, "template matching");
    
    cv::imwrite(outputfile, combined_img);
}

int main (int argc, const char * argv[])
{
    if (argc < 3) {
        std::cout << "bad argments" << std::endl;
        exit(1);
    }
    std::string imagefile = argv[1];
    std::string templatefile = argv[2];
    std::string outputfile = argv[3];
    std::cout << "inputfile   :" << imagefile << std::endl;
    std::cout << "tempatefile :" << templatefile << std::endl;
    std::cout << "outputfile  :" << outputfile << std::endl; 
    templateMatching(imagefile, templatefile, outputfile);
}

故あってskytreeの写真が100枚以上あったので、この写真に対して実行してみました(shellなりスクリプトなりでさくっと実行しました)。対象が分かりやすいので、晴れの日の写真はほとんどうまく場所が取得出来ました。
全結果をのせる事はできないので、うまく言ったものと失敗したものを載せておきます。

テンプレート画像
成功したもの
失敗したもの(曇りの時の写真だからしようがないか)
C++版の方がCに比べると書きやすい印象を持ったけど、肝心のC++がちゃんと書けないのよねえ・・・。

2012-02-23

なんちゃって赤外線カメラで

Wiredで暗視ゴーグルを通して「Kinect」を見る、という記事を見て、自分がかつて工作した赤外線カメラ(LogicoolのWebCamにIRフィルタを張っただけ)を使っても見えるんじゃないかと、試した結果が下記の写真。電気を消した状態で、Kinectを起動させて壁側に向けて、工作した赤外線カメラをKinctとほぼ同位置から壁に向けて撮りました。


上記記事のようなきれいな斑点はさすがに見えない。でもなんか不思議なパターンが出てるんだなあというぐらいは分かります。それだけです。
すでにほかでもいろいろやられているので、いまさら珍しくもないのだけど。
まあ。思わぬところで昔の工作が生きた(?)と。。。

2012-02-12

Inkscape

Mac LionでInkscape(バージョンは0.48)を使っていて、直線の矢印の部分を線の本体の色と合わせたくて、extensionsのModify Path>Color Markers to Match Strokeを選んだら、python-lxmlが無いと怒られた。
インストールしても怒られた。
http://forums.majorgeeks.com/showthread.php?t=250447
にあるようにpatchをインストールしたら、動くようになった。理由はさっぱり分からない。。。
#よく分からないままPatchを当てるなんて危険だなあとも思ったけど。。。

2012-02-09

HTML5の勉強会に行ってきた

行ってきました。久しぶりに。人気なのでなかなか枠に滑り込めない。。。
テーマは電子書籍。電子書籍には関わってないけど勤め先的には興味がある分野です。
凄い聞きがいのある勉強会でした。

いつも通りのソートも何もしていないざっくりなまとめと感想

  • iBook Autherが使ってみたくなりました
  • EPUB3のイメージが、HTML+CSS?からXML+HTML+CSSに変わりました。。。なかなか複雑な仕様のようです。リーダを作るってことはWebブラウザを作るってことに等しい気がしてきます。ブラウザベンダーに有利な展開です。
  • ↑とPDFやKindleのフォーマットなど百花繚乱な様相を呈してくると、ワンソースマルチユーズの夢を見たくなります。見る側のアプリも大変だけど、作る側のアプリはもっと大変なようです
  • 電子書籍は紙媒体のようにきっちりと固まったデザインではなく、デバイス依存になってしまう、と言うことを認めないと、作れない(コストだけがいたずらにかかる)とのこと。さもないと、今後ますますリーダが多種多様化して、Webアプリのブラウザ互換以上に、制作者にとって辛い戦いが待ち構えているような気がしてきました。
  • どうしてもレイアウトを崩したくないならEPUBではなくてPDFを使おう、みたいに目的に応じてフォーマットをうまく使い分けていく必要があるようです。
  • 電子書籍は、Webの有料化を推し進めたものである、という発想は無かったので新鮮です。
  • 生高橋メソッドが見れて良かったですww。
  • 以上のことを見てみると、まだまだ電子書籍の普及には長い道のりがありそうです。特に制作側。消費者側は比較的すんなり受け入れそうだけど、制作側の意識改革が必要になってくるのだろうと思いました。書籍と言う言葉に騙されて、単純に紙媒体の延長で考えると痛い目に合いそうです。似て非なるものだと思って、紙媒体だけでも、Webでも出せない、電子書籍特有の付加価値が付けていく必要があるのだなあと思いました。

2012-02-06

「複雑ネットワーク」とは何か

知り合いが、「スケールフリー」とかいう単語をさらっと言っているのがかっこ良かったので、「複雑ネットワーク」とは何か、という本を読んでみました。

内容的には、グラフとは何か?から始まって、「スモールワールド」(ノード間の距離がそれほど大きくなく、クラスタ性が大きいグラフ)や「スケールフリー」(ノードの次数の分布がベキ則に従う)の説明があって、伝染病や脳などの応用分野の話、という構成。

言葉がもてはやされるけど(もてはやされたのは一昔前??)、世の中も全てが全て、「スモールワールド」や「スケールフリー」では無いってことらしい。へえ〜。

自分、流行にのるのが数年遅れらしい。。。
Related Posts Plugin for WordPress, Blogger...