私はこれとこのペーパーを読んでいて、ハンド/ヘッド トラッキングについて説明していました。どちらも、動きを検出して各ピクセルの近傍の差を計算し、結果をしきい値と比較することについて話しています。
最初の論文からの引用:
参考文献で説明されている時間差分法を使用します。[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 を使用しています。