OpenCV中像素邻域差异的有效算法

时间:2012-09-10 14:25:22

标签: c image-processing opencv pixel

我正在阅读关于手/头跟踪的thisthis论文。他们都谈到检测运动计算每个像素邻域的差异,并将结果与​​阈值进行比较:

引自第一篇论文:

  

我们使用参考文献中描述的时间差分方法。 [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。

1 个答案:

答案 0 :(得分:1)

如果您首先计算绝对差异图像(即abs(_cur[] - prev[])),那么您应该可以删除大量冗余,然后重复此操作。除此之外你还可以做更多的优化,但这对于相对较少的努力来说是一个良好的开端。

另请注意,您的循环索引看起来不对 - 如果您想进行7x7邻居操作,则应该是:

for (int k=i-3; k<=i+3; k++) 
    for (int n=j-3; n<=j+3; n++) 
        ...