2012-01-16 293 views
9

我的问题是,类似这样的: OpenCV: Detect blinking lights in a video feedOpenCV的检测闪烁的灯光

我有一个LED灯,和我的相机以30fps运行。在每一帧,我都知道灯是否亮。与上一个问题类似,我也想获得该点的位置。

我现在不知道如何使用OpenCV进行这种情况下(我是新的)。如果光线只是一个像素,那很容易,但是如果背景噪音和LED的尺寸相当大,我怎么才能检测出图像中最大的光源。我必须假设我无法自由设置曝光(在iPhone上)。

我是新来的图像处理,所以我会怎么做呢?

回答

6

如果背景只是嘈杂,但不会改变这么多,你可以你backgroudn减法:

你有2帧,和你做式2-帧1,那么您应用阈值(阈值取决于LED的强度,因此您应该对其进行测试),并且您设置黑色低于阈值的像素,并将高于阈值的像素白化。

如果转换的一个灰度图像,这是很容易的。

应somenthign这样的:

cvAbsDiff(img2, img1, img2); 
cvThreshold(img2, img2, (double)threshold_value, 255 (if you are using an rgb image), CV_THRESH_BINARY); 

如果指示灯熄灭,你应该罚款只是噪音,而如果你是领导你会希望寻找到你的光illuminting白色区域。

+0

我的意思是说,光线本身可能不是唯一的白色区域。我做了cVthreshold,但问题是要设置阈值。这就是为什么我的问题是检测到最大的(区域方面)光源,因为可能有更多的光源。 openCV中是否有这样的功能来执行这种“对象”检测? – nambrot 2012-01-16 20:57:41

+0

好吧,你可以尝试,在阈值之后,申请cvfindcontours。它返回所有白色区域的轮廓列表(轮廓是cvpoints列表)。用这个你可以找到轮廓点多的区域,有一个函数来计算区域double contourArea(const Mat&contour),所以你可以看到最大的白色区域(如果大于你可以假设的某个值是) – andrea 2012-01-16 22:01:08

+0

谢谢,这对我有很大的帮助。我会尽力实现这一点。同时你得到这个问题:) – nambrot 2012-01-19 03:51:40

1

我想你不能只是在。减去两个图像来消除噪声,因为总有一些运动用相机....它不能平稳.....所以ü最终使一个烂摊子,而不是.. 。

我的通话是使用“INRANGE”功能,如果像素完全明亮,即255或上面说的200,离开它,因为它是否则只是使它零.....所以你最终只导致的部分...背景消失了!