2010-10-24 259 views
7

我想使用网络摄像头跟踪激光点(位于墙上),并且我正在使用openCV来完成此任务。任何人都可以建议我用C++来做到这一点。使用OpenCV和C++进行激光检测

谢谢!

+0

是否有可能使用某种相比,注册配色网络摄像头前面的过滤器,如果有的话,这些过滤器是什么? – Keshan 2010-10-24 19:40:25

+0

事实上,光源对你来说真的很重要,或者你只是使用一种光源,因为这是一种制造亮点的便捷方式?也就是说,你是否有理由关心源是单色和相位匹配?如果是这样,点投影表面的光学特性是什么(平坦度等)? – dmckee 2010-10-24 20:11:03

+0

你可以扫描图像的小区域,与邻近区域相比,红色分量显着增强吗? – Dialecticus 2010-10-24 20:13:51

回答

7

根据背景的稳定性以及想要对图像执行的操作,您有三个选项。

你可以使你的图像如此黑暗,你唯一能看到的就是激光点。您可以通过关闭光圈和/或缩短快门时间来完成此操作。即使使用便宜的摄像头,通常也可以在驱动程序中完成。一旦你完成了这个工作,找到激光点的工作非常简单。您尽可能使图像变暗,因为通常激光照射的位置太亮而不适合相机拾取。这意味着(正如你所经历的那样),你不能辨别图像中的光激光点和其他光物体。通过变黑,你现在可以做到这一点。

如果您对图像有其他用途(显示给人)并且背景稳定,您还可以将最后几幅视频图像的平均值用作“背景”,然后找到大的地方该背景与最新图像之间的差异。这通常是激光指向的地方(同样,如果你的背景足够稳定)。最后,如果你的背景不稳定,并且你不想让图像变得非常黑暗,那么最后的选择是寻找所有像素都非常亮,红色通道比绿色更亮和蓝色(如果您使用的是红色激光)。这个系统仍然会被白点分散注意力,但不像找到明亮的像素那样多。如果您的激光指示器点的中心确实显示为亮白色,而不考虑激光颜色,则此技术将允许您在该亮点周围找到“环”(点的外部,其中激光器不像它位于图像中心,以便与图像中激光的实际颜色一起显示)。然后你可以使用简单的morphological operations,(可能是closing已经足够)来填充这些圈子。

+0

我想我最好尝试前两个选项,似乎可能:)。非常感谢你。 – Keshan 2010-10-25 17:14:11

4

假设您使用这些颜色之一的激光:红色,绿色,蓝色。 如果激光点显得非常亮(至少在一个通道中,例如红色),那么简单地对图像/通道进行阈值处理,比如灰度值为200,将会为您提供几个候选激光。如果其他通道在这个区域内很暗(呃),那么你知道这是一个正确颜色的明亮光线。按尺寸过滤一下,你很有可能找到这个位置。

+0

感谢您的回复,我有一面墙,它正在投影,因此,当我限定图像并寻找红色通道时,投影表面上的红色有时可能会造成一些麻烦。 – Keshan 2010-10-25 02:45:38

3

如果你在你的摄像头上贴一个红外滤镜,你的投影将不会被拾取,使激光点的检测更容易(使用简单的背景扣除等)。假设激光指示器发出红外光...

0

尝试模板Maching。 首先你将“指针”指向一个特定的地方,这样就可以完成圣殿了。然后你只需要寻找它。

或者,正如jilles de wit所言,你可以把最后2帧的差异,可能差异会显示你的指针。

将最后2帧转换为灰度,然后应用SUB功能。

1

正如其他答案中所建议的那样,搜索颜色可能是一个好主意。 你应该考虑寻找一个特定的颜色范围。最好的方法是将图片转换为HSL或HSV色彩空间。

cv::cvtColor(src, hsv, COLOR_BGR2HSV); 

有关Wikipedia的更多信息。

然后你有三个通道: 色调(=颜色),饱和度和亮度(或值)。

使用cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange);您现在可以生成黑白图像,该图像显示颜色范围内的像素。 标量是每个通道的低值和高值。

在这个例子中,你将获得像素,135和255和值165和200

之间也许这可以提高您的跟踪之间的159和179(色调)之间的颜色,饱和度。