繁体   English   中英

通过图像减法进行分割的优化算法

[英]Optimizing algorithm for segmentation through image substraction

对于OpenCV中的项目,我想尽可能地将运动对象进行分割 ,同时将噪声降至最低。

为此,我想使用图像减法算法。 我已经有一个正在运行的程序,但今天找不到找到足够公平结果的方法。

我已经提供了以下(灰度)图像:

IplImage* grayScale;
IplImage* lastFrame;
IplImage* secondLastFrame;
IplImage* thirdLastFrame;

到目前为止,我已经尝试使用cvSub();减去当前帧图像和最后一帧图像cvSub(); 或使用cvAbsDiff(); 获得运动部件。

但是不幸的是,那里还是有很多噪音(例如,由于大风时树木略微移动),并且如果移动的物体很大并且具有同质的颜色(比如说一个穿着白色或黑色衬衫的人),则减去仅检测人的左侧和右侧图像的变化,而不检测人体本身,因此有时会将一个对象检测为两个对象...

cvAbsDiff(this->lastFrame,grayScale,output);
cvThreshold(output,output,10,250, CV_THRESH_BINARY);
cvErode(output,output, NULL, 2);
cvDilate(output,output, NULL, 2);

为了消除这种噪音,我尝试使用cvErode()cvDilate()腐蚀并扩大图像, cvErode()很慢,而且如果屏幕上的移动物体很小,腐蚀会侵蚀很多物体,因此在求和后我并不总是获得良好的结果或分裂的对象。

之后,我执行cvFindContours()来获取轮廓,检查尺寸,如果合适,请在移动的对象周围绘制一个矩形。 但是结果很差,因为由于分割不正确,通常将一个对象分成几个矩形。

现在有个朋友告诉我,我可能会尝试使用两个以上的帧进行减法运算,因为这可能已经减少了噪音...但是我真的不知道他的意思,以及我应该如何添加/减去这些帧以获得减法。几乎没有噪点并显示足够大的物体斑点的图像。

有人可以帮我吗? 如何使用多于一帧的图像以获得尽可能低的噪点,但具有足够大的斑点来容纳运动对象? 我将不胜感激...

附加内容:

我已经在这里上传了当前视频: http : //temp.tinytall.de/也许有人想在这里尝试...

这是它的框架:左图显示了我从cvFindContours()获得的结果,右图是分割后的图像,然后我尝试在该图像上找到轮廓...

分割结果

因此,如果一个大物体以足够快的速度运动(例如,自行车),它就可以很好地工作,但是在走路的人看来,它并不总是能得到很好的结果。

给定三个相邻的帧A,B,C,您可以获得两个帧差X和Y。通过组合X和Y(例如,通过阈值然后进行逻辑AND运算),可以减少噪声的影响。 不利的副作用是,运动检测到的区域将略小于理想区域(“ AND操作将减小该区域)。

由于对图像序列运动估计进行了数十年的深入研究,因此您可能想阅读有关运动检测的更复杂方法的信息,例如使用运动矢量场。 在这种情况下,Google学术搜索是您的朋友。

看来您有固定的背景。 一种可能的解决方案是让计算机学习背景,例如。 通过随着时间的推移取平均值。 然后计算平均图像与当前图像之间的差异。 差异很可能源自移动物体。

好吧,这是一个非常棘手的话题。 运动估计非常复杂。 因此,尝试找到好的文献并避免发明算法:)

我的建议是:

搜索捆绑图像以进行运动估计 捆绑使用许多图像来减少噪声和错误率。

最终,如果您想变得健壮,请研究一下所谓的卡尔曼滤波器。 如果要跟踪对象,则不希望它们在帧之间进行“无限速跳”(通常是杂讯或遗漏)。 我强烈建议使用卡尔曼过滤器,这是一个C ++库

最后,MonoSLAM,我要介绍一下:) Andrew Davison:研究

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM