Category
一生懸命POCを実装していましたが、
OpenCV内にphaseCorrelateとしてPOCが定義されているのを発見しました。

ヘルプなどあさってみましたが特に記載されていないため、
まだベータ版なのかもしれませんが問題なく動作していたためご紹介を

opencvフォルダ内の以下のディレクトリにそれぞれ格納されていました。
関数自体の定義
modules\imgproc\src\phasecorr.cpp
モジュール(?)のテスト
modules\imgproc\test\test_pc.cpp
使用方法
samples\cpp\phase_corr.cpp



ソース

phase_corr.cppをそのまま転載します。

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

int main(int, char* [])
{
    VideoCapture video(0);
    Mat frame, curr, prev, curr64f, prev64f, hann;
    int key = 0;

    do
    {
        video >> frame;
        cvtColor(frame, curr, CV_RGB2GRAY);

        if(prev.empty())
        {
            prev = curr.clone();
            createHanningWindow(hann, curr.size(), CV_64F);
        }

        prev.convertTo(prev64f, CV_64F);
        curr.convertTo(curr64f, CV_64F);

        Point2d shift = phaseCorrelate(prev64f, curr64f, hann);
        double radius = cv::sqrt(shift.x*shift.x + shift.y*shift.y);

        if(radius > 5)
        {
            // draw a circle and line indicating the shift direction...
            Point center(curr.cols >> 1, curr.rows >> 1);
            cv::circle(frame, center, (int)radius, cv::Scalar(0, 255, 0), 3, CV_AA);
            cv::line(frame, center, Point(center.x + (int)shift.x, center.y + (int)shift.y), cv::Scalar(0, 255, 0), 3, CV_AA);
        }

        imshow("phase shift", frame);
        key = waitKey(2);

        prev = curr.clone();
    } while((char)key != 27); // Esc to exit...

    return 0;
}



27行目がPOCです。画像を渡すとPoint2dで座標が返却されます。
動作内容はカメラから画像(フレーム)を取得し、前のフレームと比較しカメラがどちらに動いているか判定するようです。
移動方向をフレーム中心の円の大きさを用いて表示するようになっております。

参考までにご紹介です。
以前行った、
位相限定相関(POC)で求めたピーク値を探し出せば、移動量が求められるのですが、

画像は整数の値しかとらない格子なので、サブピクセルのレベルで移動していた場合詳細は求められません。

スズメレンダラー・クマ将棋の開発日記さんの記事ではSinc関数に当てはめて求める方法が記載してあります。

ちなみに、Sinc関数とは以下のような関数です


調べてみたところ、最急降下法などで関数のフィッティングを行い厳密な値を求めていきます。



・・・ですが、

私のような凡人にはちょいと難しかったので、もっと簡単な方法を探してました。
x方向だけで考えると移動量dは、




と表すことができます。ここで、
・R(0)はピーク値(位相限定相関画像の値)
・R(-1)はピーク値の一つ前の座標の相関値
・R(1)はピーク値の一つ先の座標の相関値

です。

このパラボラフィッティングを使えば、Sinc関数よりは精度は落ちますが楽にサブピクセル精度で移動量を算出できます。


また、等角直線フィッティングもあるそうですが、
1次関数でのフィッティングであるため、パラボラフィッティングの2次関数の方が精度はよいと考えられます。


IplImage()やCv.CreateImage()で使うEnum等がいまいち覚えられなくて、
その都度調べているという状態がもったいないのでまとめてみました。

とりあえず、今回はLoadModeとBitDepthについて簡単にまとめてみました。

LoadMode

IplImage()の第2引数等で使用するLoadModeについてまとめたのが以下の表です。
実際に定義されているソースはhttp://opencvsharp.googlecode.com/svn/trunk/2.4/OpenCvSharp/Src/Enum/LoadMode.csになります。



OpenCV
OpenCVSharp
備考
CV_LOAD_IMAGE_UNCHANGED
LoadMode.Unchanged
-1
CV_LOAD_IMAGE_GRAYSCALE
LoadMode.GrayScale
0
CV_LOAD_IMAGE_COLOR
LoadMode.Color
1
CV_LOAD_IMAGE_ANYDEPTH
LoadMode.AnyDepth
2
CV_LOAD_IMAGE_ANYCOLOR
LoadMode.AnyColor
4



BitDepth

Cv.CreateImage()等の第2引数で使用する、BitDepthについてOpenCVとOpenCVSharpの差異についてまとめたものが以下です。
実際に定義されているソースがhttp://opencvsharp.googlecode.com/svn/trunk/2.4/OpenCvSharp/Src/Enum/BitDepth.csになります。



OpenCV
OpenCVSharp
備考
IPL_DEPTH_1U
BitDepth.U1
2値画像
IPL_DEPTH_8U
BitDepth.U8
通常のグレースケール画像
IPL_DEPTH_16U
BitDepth.U16
単精度画像
IPL_DEPTH_32F
BitDepth.F32
倍精度画像
IPL_DEPTH_8S BitDepth.S8
符号付きグレースケール画像
IPL_DEPTH_16S
BitDepth.S16 符号付き単精度画像
IPL_DEPTH_32S
BitDepth.S32 符号付き倍精度画像


自分のメモ程度ですが、今後必要になればまた作成しようと思います。

※数年ぶりにtableのhtmlを書いたらすっかり忘れています・・・汗
ExcelVBAで画像処理の場合のように、
有効な範囲を取得しその範囲で処理を行いたい場合の方法のメモ

'シートで使用されている最大行数を取得
LastRowIndex = Cells(1, 1).End(xlDown).Row

'シートで使用されている最大列数を取得
LastColumnIndex = Cells(1, 1).End(xlToRight).Column

'カウンター
i = 0
j = 0

For i = 1 To LastRowIndex
    For j = 1 To LastColumnIndex
        'ここに処理を書く
    Next
Next


Excelのセル「A1」上でctrlキーを押しながら→や↓を押したときと同じ挙動を行っているようです。

ただ、問題点としては不連続な領域ではこの手法を扱えないというところです。

PythonをWindowsでプログラミングするために、eclipse+Pydevをインストールしたのですが、


下のように改行マークが不思議なことに・・・(汗

文字コードまわりで失敗しているか疑っていたのですが違ったようです。

code.png





調べたところ、
「一般」→「エディター」→「テキスト・エディター」の 「空白文字の表示」のチェックを外せばよいとのこと

設定





適用して確認したところ、表示が消えました。


code2.png


※変なマークと言ってしまったけど、eclipseでは標準だったのですね(;´Д`)
 失礼いたしました。。。
FC2カウンター
プロフィール

詠み人知らず

Author:詠み人知らず
プログラム好きな名もなき凡人がお送りしています。(得意とは言っていない
最近の興味はPython、C#、Matlab(Octave)、画像処理、AR(拡張現実)、統計などなど・・・

気分で思いついたことを書くため話題に一貫性がないかもしれません。

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
最新記事
タグクラウドとサーチ

カテゴリ
最新コメント
最新トラックバック
月別アーカイブ