首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV中像素邻域差的有效算法

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

Stack Overflow用户
提问于 2012-09-10 14:25:21
回答 1查看 2.9K关注 0票数 0

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

引用第一份文件的话:

我们使用参考文献中描述的时态差分方法。41,计算每个像素周围邻域差异的绝对值,然后通过对所有相邻像素的差值求和,得出累积差值。当累积差值超过预定阈值时,像素被分配到移动区域.

是否有一种有效的方法(可能在OpenCV中)?

我编写的代码非常天真,除了失去实时性之外,似乎没有比简单的像素与像素之间的差异更好的结果:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-10 14:30:36

如果您首先计算绝对差图像(即abs(_cur[] - prev[])),然后迭代处理,您应该能够删除大量的冗余。除了这一点,还有更多的优化可以做,但是对于相对较少的努力来说,这是一个很好的开端。

还请注意,您的循环索引看起来是错误的-如果您想要执行7x7邻域操作,应该是:

代码语言:javascript
复制
for (int k=i-3; k<=i+3; k++) 
    for (int n=j-3; n<=j+3; n++) 
        ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12353730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档