我正在阅读这篇文章和这篇关于手/头跟踪的论文。他们都谈到了检测运动计算每个像素邻域的差异并将结果与阈值进行比较:
引用第一篇论文:
我们使用参考文献中描述的时间差分方法。[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。