如何判断视频中的某一帧/图像是否处于夜视模式?

问题描述 投票:0回答:2

我的输入视频来自智能闭路电视摄像机,当天色足够暗时,它会自动进入夜视模式。

我想确定我正在使用 open-cv (cv2) 处理的视频中的帧/图像是否是处于夜视模式的帧/图像。

不幸的是,即使它仍然切换到夜视模式,每帧/图像的形状也是(1920,1080,3),这意味着它仍然处于RGB通道(3通道)。

有什么方法可以实现我想要实现的目标吗?

提前感谢您花时间思考并回答我的问题。

除了查看每帧/图像的通道数之外,我找不到其他方法。

这是一个示例图像,显示了正常模式和夜视模式下视频帧/图像的差异:

正常与夜视模式

python opencv image-processing computer-vision
2个回答
2
投票

如果您的夜间模式图像是 3 通道的,与白天模式图像相同,但看起来是灰色的,那么您的相机很可能具有红外(或其他)单通道(灰度)传感器,并且在激活时在晚上,单个通道只是复制到其他两个空通道中,然后由相机发送到您的应用程序。

您可以通过查看第一个像素或任何其他像素并查看 R、G 和 B 通道是否全部相等来测试这一点,例如,查看第一个像素:

# {Print all three RGB channels of pixel at [0,0]
print(im[0,0,:])

如果全部相同,则会显示为灰色。如果您的相机以彩色录制,它们不太可能相同。

因此,要测试整个框架,您可以使用

numpy.allclose()
来查看红色是否靠近绿色以及绿色是否靠近蓝色:

Reds   = im[:, :, 0]
Greens = im[:, :, 1]
Blues  = im[:, :, 2]
nightmode = np.allclose(Reds, Greens, atol=2.0) and np.allclose(Greens, Blues, atol=2.0)

我在亮度相等时设置了 2 的公差,以允许 100% 相同的情况存在一些偏差 - 尽管我不确定这是如何实现的。


1
投票

除非相机提供 API 来提供该信息,否则您将无法确定。 再加上“夜视模式”涵盖了许多不同的东西。

有时(但你会知道这一点。它花费了一大笔钱,另外,在许多国家,销售受到限制,因为它被认为是武器)它是真正的夜视仪(带有 MCP 管和所有)。我不知道这种相机可以“切换”到夜视模式。我知道的那个只做这一件事,并且没有 RGB 通道。但是,如果是的话,这种相机的一个想法可能是检测“鸡围栏”(它们在图像中非常静态。因此,鸡围栏的预学习位置中的像素的简单总和应该可以做到)。

对于其他一些相机来说,这实际上是传感器的改变,切换到具有宽光谱的非彩色传感器。 RGB 通道只是同一事物的 3 个副本。你只需要检测到这一点

有时,夜视仅意味着红外 LED 已打开。大多数相机都可以看到红外线。不情愿。但是,这可能很有用,因为这意味着在夜间,红外光照明的场景将是可见的。你可以用你的手机摄像头和电视遥控器检查一下:你肉眼看不到电视的红外灯,但通过手机摄像头,就像一个灯在闪烁。

在这种情况下,它仍然是同一个相机。像素确实是彩色的。只是,在真实场景中看不到任何颜色,仅通过红外照明(有点像如果您仅通过绿光照亮场景,那么,相机仍然是 RGB,但您看不到颜色。只有水平绿色)

如果这种情况逐渐发生,情况会更糟。因此,如果在某个时刻,越来越多的光来自红外线,而来自衰落的真实光的光越来越少。

我会尝试(但没有任何例子我不能说更多)是通道之间的余弦相似度。 RGB 通道在白天可能会有所不同,而在夜间则更相似(换句话说,夜间图像看起来更加单色)。那么一些

(img[:,:,0].astype(float)*img[:,:,1].astype(float)).sum()/np.sqrt((img[:,:,0].astype(float)**2).sum()*(img[:,:,1].astype(float)**2).sum())

(此处仅使用 2 个通道。但可以使用通道 0 和 2,和/或通道 1 和 2 重复)

看看该值在白天和晚上是否会有所不同。并通过实验找到阈值。

© www.soinside.com 2019 - 2024. All rights reserved.