7

我想用网络摄像头跟踪一个激光点(在墙上),我正在使用 openCV 来完成这项任务。任何人都可以建议我用 C++ 做到这一点。

谢谢 !

4

6 回答 6

8

您有三个选项,具体取决于背景的稳定性以及您想要对图像执行的操作。

您可以使图像变得如此暗,以至于您唯一能看到的就是激光点。您可以通过关闭光圈和/或减少快门时间来做到这一点。即使使用便宜的网络摄像头,这通常也可以在驱动程序中完成。完成此操作后,找到激光点的工作就非常容易了。您使图像尽可能暗,因为通常激光照射的点太亮,相机无法拍摄。这意味着(正如您所经历的)您无法区分图像中的光激光点和其他光物体。通过使其变暗,您现在可以做到这一点。

如果您的图像有其​​他用途(向人们展示)并且您的背景稳定,您还可以使用最后几张视频图像的平均值作为“背景”,然后找到该背景之间存在较大差异的位置和最新的图像。这通常是激光指向的地方(同样,如果您的背景足够稳定)。

最后,如果您的背景不稳定并且您不想让图像变得非常暗,那么您的最终选择是寻找所有既非常亮又在红色通道中比在绿色和蓝色通道中更亮的像素(如果您正在使用红色激光)。这个系统仍然会被白点分散注意力,但不会像只找到明亮的像素那样多。如果无论激光颜色如何,您的激光指针光斑的中心确实显示为亮白色,那么此技术将允许您在该亮点周围找到“环”(激光不亮的点的外部部分)它位于中心,以便在图像中显示激光的实际颜色)。然后,您可以使用简单的形态学操作(可能关闭就足够了)来填充这些圆圈。

于 2010-10-25T13:21:15.137 回答
4

Let say you use a laser of one of these colors: red, green, blue. If the laser dot appears very bright (at least in one channel, e.g. red) then simply thresholding the image/channel at, say greyvalue of 200, will leave you with a few candidates for the laser light. If the other channels are dark(er) in this area, then you know it is a bright light of the right color. A little filtering by size, and you have a good chance of finding the spot.

于 2010-10-24T20:53:35.757 回答
3

如果您在网络摄像头上粘贴红外滤光片,您的投影将不会被拾取,从而更容易检测激光点(使用简单的背景减法等)假设激光指示器发出红外光......

于 2010-10-25T12:55:08.557 回答
1

这段代码怎么样

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

https://github.com/niitsuma/detect_laser_pointer

在此代码中,观察到的 HSV 颜色与使用 Hotelling t 平方检验的注册颜色进行比较

于 2014-05-25T05:44:33.640 回答
1

正如其他答案中所建议的那样,搜索颜色可能是一个好主意。您应该考虑寻找特定的颜色范围。最好的方法是将图片转换为 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 之间的像素。

也许这可以改善您的跟踪。

于 2013-10-28T10:00:40.483 回答
0

尝试模板加工。首先你把指针“指向”一个特定的地方,这样寺庙就可以完成了。然后,您只需寻找它。

或者,正如 jilles de wit 所说,您可以获取最后 2 帧的差异,可能差异会显示指针。

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

于 2011-01-31T22:48:38.487 回答