おぺんcv

画像処理エンジニアのブログ

Google Code Jamに参加してみた

Googleが開催するプログラミングコンテストGoogle Code Jam」の予選ラウンドに参加しました

全4問のうち、正解率の高かった2問は何とか解くことができたのですが

3問目で解答が思いつかず降参

プログラミングコンテスト、興味はあって取り組むようにしてるのですが

問題を読んでるだけで頭が痛くなってきます…

向いてないのかな…

字下げスタイルとわたし

「字下げスタイル?コーディング作法って何?」

って感じで学生の頃はこんなコードを書いてました

void func(float *a,float *b,int n){
    for(int i=0; i<n; i++){
        b[i] = a[i] ;
    }
}

いま思うと、いろいろと気になるところがある

  • 変数名適当
  • 基本的にスペースが無い
  • なのに何故かセミコロンの前だけスペース!?

「会社に入って」

他人とコードを共有したり、参考書を読むようになってからは、ちょっとましになった思います

  • 関数名とか、変数名を適当にしない
  • コメント書く
  • 既存のスタイルに従う(K&Rスタイルとか)
// n要素コピーする
void copy(const float *src, float *dst, int n)
{
    for (int i = 0; i < n; i++) {
        dst[i] = src[i];
    }
}

最近は

なんとなくBSDスタイルいいんじゃね?と思い始めてます
全て中括弧を次の行に置く一貫性と、if-else句の見易さが良いです
コードが長くなりがちだけど

void copy(const float *src, float *dst, int n)
{
    for (int i = 0; i < n; i++)
    {
        dst[i] = src[i];
    }

    if (hoge)
    {
        hogehoge();
    }
    else
    {
        hogehogehoge();
    }
}

皆さんはどのスタイルを使いますか

OpenCVのMean-shift Trackingを試してみた

OpenCVで使える、色ベースのトラッキング「meanShift」と「CamShift」を紹介します!

何ができるの?

追跡したい対象の領域をはじめに指定することで、
その色情報(ヒストグラム)をもとに、対象を追跡できます
探索窓が固定なMeanShiftに対し、CamShiftは物体サイズに合わせて窓サイズを調整してくれます

試してみよう

OpenCVにCamShiftのサンプルコードがあります
(OpenCVのインストール先)/sources/samples/cpp/camshiftdemo.cpp

実行例:YouTubeから拾った動画で失礼します
OpenCV + Camshift Demonstration - YouTube

meanShiftも試してみたい

camshiftdemo.cppを少し修正すると、meanShiftも試すことができます
CamShift()の呼び出し箇所

cv::RotatedRect trackBox = cv::CamShift(backproj, trackWindow,
                    cv::TermCriteria(cv::TermCriteria::EPS | cv::TermCriteria::COUNT, 10, 1));

を以下のように修正します

cv::meanShift(backproj, trackWindow, cv::TermCriteria(cv::TermCriteria::EPS | cv::TermCriteria::COUNT, 10, 1));

また、すぐ下の領域を描画する箇所

cv::ellipse(_image, trackBox, cv::Scalar(0, 0, 255), 3, cv::LINE_AA);

を以下のように修正します

cv::rectangle(_image, trackWindow.tl(), trackWindow.br(), cv::Scalar(0,0,255), 3, cv::LINE_AA);

終わりに

今回は「meanShift」と「CamShift」の表面だけ紹介しましたが
今後、追跡の仕組みについても解説したいと思います