我想跟踪激光点(这是在墙上)配有摄像头和我使用的OpenCV做这个任务。任何人可以建议我的方式与C ++来做到这一点。

谢谢!

有帮助吗?

解决方案

您有三种选择取决于你的背景的稳定性,并要与图像做的事情。

您可以让你的形象太黑了,你能看到的仅仅是激光点。您可以通过关闭膜片和/或降低快门时间做到这一点。即使有便宜的摄像头这通常可以在驱动程序中进行。一旦你做到了这一点寻找激光点的工作是很容易的。你使图像暗越好,因为通常在激光照射点是太亮,相机无法回暖。这意味着(因为你经历过),你不能光激光点和其他轻的物体的图像之间辨别。通过使变暗你现在可以做到这一点。

如果您有其他用途的图像(它显示的人)和你的背景是稳定的,你也可以使用普通的最后几个视频图像作为“背景”,然后找到那里是一个大的差异现货该背景和最新的图像之间。这通常是在激光是尖(再次,如果背景是足够稳定)。

最后,如果你的背景是不是稳定的,你不想让你的图像很暗您的最终选择是寻找那些都是很亮的所有像素,明亮的红色通道比在绿色和蓝色(如果你使用的是红色激光)。该系统将仍然由白点分心,但不如刚刚找到亮的像素。如果你的激光指针点的中心确实显示为亮白色,无论激光的颜色那么这种技术将让你找到“环”,围绕这一亮点(点外部分,其中激光是不一样明亮它是在中心,以便它显示了激光器的图像中的实际颜色)。然后,您可以使用简单的形态学操作,(可能的是足够)来填充这些社交圈。

其他提示

让说你使用这些颜色之一的激光:红色,绿色,蓝色。 如果激光点出现非常明亮(至少在一个通道,例如红色),那么只需在设定阈值的图像/通道,说greyvalue的200,你会留下的激光的几个候选人。如果其他通道此区域黑暗(ER),那么你知道它是正确的颜色的明亮的光。通过大小筛选小,你必须找到地点的一个很好的机会。

如果你坚持你的网络摄像头红外滤镜,您的投影不会回升,使得更容易(使用简单的背景减法等),激光点的检测这是假设激光指示器发出红外光...

在其他的答案表明,搜索的颜色可能是一个好主意。 你应该考虑寻找一个特定的颜色范围。做到这一点最好的方法是将图片转换为HSL或HSV颜色空间。

cv::cvtColor(src, hsv, COLOR_BGR2HSV);
维基百科

的更多信息。

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

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

在这个例子中,你会得到与像素159和179(色调),135和255和165和200之间的值之间饱和度之间的颜色。

也许这可以提高您的跟踪。

这样如何代码

https://www.youtube.com/watch?v=MKUWnz_obqQ

https://github.com/niitsuma/detect_laser_pointer

在此代码,观察到HSV颜色使用相比注册颜色霍特林吨方检验

尝试模板MACHING。 首先你“的指针指向”一个特定的地方,因此寺庙可以做到的。然后,你只是看它。

或者,作为jilles德维特说,你可以把过去的2帧的差异,可能是差会告诉你的指针。

转换的最后2个帧做灰度,然后应用SUB功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top