使用通用网络摄像头进行对象检测

问题描述:

以下是我想尽可能少地努力解决的任务(最好使用QT & C++或Java):我想使用网络摄像头视频输入来检测是否有一个(或多个)箱子(s)在相机镜头前面或没有。场景可以从“清晰”变为“镜头前有一个箱子”,并且在凸轮将其视频信号传送给我的应用程序时返回。对于原型测试/学习,我有2-3个“空”场景图像和2-3个带有一个或多个箱子的图像。使用通用网络摄像头进行对象检测

你知道如何直接解决这个问题吗?我发现了OpenCV,但是这个框架太笨重了吗?我是计算机视觉领域的新手。这通常是一项艰巨的任务,还是简单而强大,可以检测活动饲料中凸轮前方是否存在障碍物?您的专家意见深表感谢!

+0

祝你好运。大部分这种应用程序都是在大学自定义生成的。所有在公司生成的软件都是专有或出售的。在Google上搜索“对象识别库开放源代码”。 – 2011-03-09 22:37:09

你不需要一个完整的计算机视觉库来检测相机前面是否有箱子或没有箱子。您可以拍摄一张快照并制作颜色直方图(简单)。为了捕捉快照到这里看看:

http://msdn.microsoft.com/en-us/library/dd742882%28VS.85%29.aspx

很多变量这里包括环境照明和任何可能的变化在视场的任何其他活动。看看如何实现一个Canny边缘检测器(OpenCV以及Intel Performance Primitives也可以)来查找感兴趣形状的轮廓。如果你知道盒子的位置,你可以将感兴趣区域的像素相加。如果盒子可以出现在视野的任何地方,这是更具挑战性的。

这里有一个方法,我听说过,这可能会产生一定的成功:

  • 您的图像进行边缘检测,其中边缘显示为黑色像素将它翻译成黑白图像。
  • 现在创建一个直方图来记录图像中每个垂直像素列中黑色像素的频率。这里的理论是,一个桶中或其周围的直方图中的高频值表示垂直边缘,这可能是一个箱子的边缘。

您也可以考虑使用第二个直方图来测量图像每一行上的像素。

显然这是一个相当简单的方法,并高度依赖于“简单”输入;即对于空白背景具有“硬”边缘的普通盒子(优选与盒子形成强烈对比的背景)。

这不是你应该从Java开始的东西。当我遇到这种问题时,我会从Matlab(OpenCV库)或类似的东西开始,看看解决方案是否能在那里工作,然后将它移植到Java。

为了回答你的问题,我做了一些类似的操作,通过对当前图像的'参考'图像(在你的情况中没有箱子)进行异或处理,然后对直方图进行处理(聚类像素在右边意味着很大的差异)可见像素并将其与阈值进行比较。异或并不精确,但速度很快。

我的观点是,我花了2小时安装Scilab和工具包,并写了一个概念证明。如果第一个解决方案没有在每个额外的算法(已经在Mat-/Scilab中完成)再运行几个小时,那将花费我两天的时间。恕我直言,你是从错误的角度接近问题。

如果真的Java/C++只是一些无关紧要的简单工具,然后放下它们并使用Scilab或其他Matlab克隆 - 原型和微调将更快。

有2个零件涉及物体检测。一个是特征提取,另一个是相似度计算。一些明显的特点是几何,边缘,纹理等...

所以你可以找到一些算法来从你的箱子图像中提取这些功能。然后将这些功能与训练样本图像进行比较。