代码之家  ›  专栏  ›  技术社区  ›  Keshan

用OpenCV和C++实现激光检测

  •  7
  • Keshan  · 技术社区  · 14 年前

    我想用摄像头跟踪一个激光光点(在墙上),我正在使用openCV来完成这项任务。有人能建议我用C++来做吗?

    谢谢您!

    6 回复  |  直到 11 年前
        1
  •  8
  •   hlkstuv_23900    11 年前

    你有三个选择,取决于你的背景的稳定性,以及你想对图像做的事情。

    你可以使你的图像如此黑暗,以至于你只能看到激光点。可以通过关闭光圈和/或缩短快门时间来完成此操作。即使有便宜的摄像头,这通常也可以在司机身上完成。一旦你完成了这项工作,找到激光点是非常容易的。你使图像尽可能暗,因为通常激光照射的点太亮,相机无法捕捉到。这意味着(正如你所经历的那样)你无法分辨激光点和图像中的其他光对象。通过使它变暗你现在可以做到这一点。

    如果你对你的图像有其他用途(向人们展示),而且你的背景是稳定的,你也可以用最后几幅视频图像的平均值作为“背景”,然后找到背景和最新图像之间有很大差异的地方。这通常是激光指向的地方(同样,如果你的背景足够稳定)。

    最后,如果你的背景不稳定,你不想让你的图像很暗,你的最终选择是寻找所有像素,既非常明亮,在红色通道比他们在绿色和蓝色更亮(如果你使用红色激光)。这个系统仍然会被白点分散注意力,但不会像只找到明亮的像素那么多。如果无论激光颜色如何,激光指针光斑的中心确实显示为亮白色,则此技术将允许您在该亮点周围找到“光环”(光斑的外部,其中激光不如其中心明亮,因此它在图像中显示为激光的实际颜色)。你可以用简单的 morphological operations ,(可能 closing 足以填满这些圆圈。

        2
  •  4
  •   Adi Shavit    14 年前

    如果激光点看起来非常亮(至少在一个通道中,例如红色),那么简单地将图像/通道的阈值设为200,比如说灰度值为200,将为您留下几个激光候选。如果这个区域的其他通道是暗的(er),那么你知道这是一个正确颜色的明亮的光。稍微按大小过滤一下,你就有很好的机会找到那个地方。

        3
  •  3
  •   max    14 年前

        4
  •  1
  •   hlkstuv_23900    11 年前

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

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

    更多信息 Wikipedia .

    那么你有三个频道:

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

    也许这能改善你的追踪。

        6
  •  0
  •   rafael i cuzziol    14 年前

    试试模板加工。 首先,你要把指针指向一个特定的地方,这样寺庙就可以完成。那你就去找吧。

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

    转换最后两帧做灰度,然后应用子函数。