我想使用OpenCV来追踪墙上的激光点。请问有没有人能向我介绍一种用C++实现此任务的方法?
谢谢!
谢谢!
假设你使用了以下其中一种颜色的激光:红色,绿色,蓝色。 如果激光点非常明亮(至少在一个通道,比如红色通道),那么将图像/通道阈值设置为200的灰度值,将留下一些激光光线的候选项。如果其他通道在该区域内较暗,则知道这是正确颜色的亮光。进行一些大小过滤,你就有很好的机会找到这个点。
如果你在网络摄像头上贴上红外过滤器,那么你的投影将不会被捕捉到,这样就更容易检测激光点(使用简单的背景减法等)。前提是激光笔发出红外光...
如其他答案所建议的那样,搜索颜色可能是一个好主意。 您应该考虑寻找特定的颜色范围。最好的方法是将图片转换为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之间的像素。
也许这可以改善你的跟踪。
尝试模板匹配。首先,您需要“指向指针”到特定位置,以便可以完成模板。然后,您只需寻找它。
或者,正如jilles de wit所说,您可以取最后2帧的差异,可能会显示出指针。
将最后2帧转换为灰度,然后应用SUB函数。
s/red/you laser's color/
。 - dmckee --- ex-moderator kitten