0

私はこれこのペーパーを読んでいて、ハンド/ヘッド トラッキングについて説明していました。どちらも、動きを検出して各ピクセルの近傍の差を計算し、結果をしきい値と比較することについて話しています。

最初の論文からの引用:

参考文献で説明されている時間差分法を使用します。[41] は、各ピクセルを囲む近傍の差の絶対値を計算し、すべての隣接ピクセルの差を合計することによって累積差を導出します。累積された差が所定の閾値を超える場合、ピクセルは移動領域に割り当てられる。

それを行う効率的な方法はありますか(おそらくOpenCVで)?
私が書いたコードはかなり素朴で、リアルタイム性を失うだけでなく、単純なピクセル間の違いよりも良い結果が得られないようです。

template<class T> class Image {
private:
    IplImage* imgp;
public:
    Image(IplImage* img=0) {imgp=img;}
    ~Image(){imgp=0;}
    void operator=(IplImage* img) {imgp=img;}
    inline T* operator[](const int rowIndx) {
        return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));}
};

typedef Image<unsigned char>  BwImage;
typedef Image<float>          BwImageFloat;


void computeMovingRegion( IplImage* prev,  IplImage* cur, IplImage *mov) {

    BwImage _prev(prev);
    BwImage _cur(cur);
    BwImage _mov(mov);

    for (int i = 3; i<prev->height-3; i++) {
        for (int j=3; j<prev->width-3; j++) {

            int res=0;

            for (int k=i-3; k<i+3; k++) 
                for (int n=j-3; n<j+3; n++) 
                    res += abs(_cur[k][n] -_prev[k][n]);

            if (res>2000) {
                _mov[i][j]=_cur[i][j];
            }
            else
                _mov[i][j]=0;

        }
    }
}

画像はグレースケールです。関係ないと思いますが、私は MacOS 10.8 と Xcode 4.4.2 を使用しています。

4

1 に答える 1

1

abs(_cur[] - prev[])最初に絶対差分画像 (つまり) を計算してから、これを繰り返すだけで、多くの冗長性を取り除くことができるはずです。これ以外にも多くの最適化を行うことができますが、これは比較的少ない労力で始めるのに適しています。

また、ループのインデックス付けが間違っているように見えることにも注意してください。

for (int k=i-3; k<=i+3; k++) 
    for (int n=j-3; n<=j+3; n++) 
        ...
于 2012-09-10T14:30:36.157 に答える